連載 SQL ServerでXMLを操作する
第1回:リレーショナルDBからXML文書を取り出す

2.  リレーショナルデータをXML文書として取り出す

リレーショナルデータとXML文書のマッピング

 リレーショナルなデータをXML文書として取り出したり、逆にXML文書をリレーショナルなデータとして格納する場合には、XML文書内のデータとリレーショナルなデータをマッピング(対応付け)してやる必要があります。

 SQL Server 2000ではデータベース内のデータをXML文書にマッピングする場合、テーブル名を親要素、列名を子要素または属性として使用して1行分のデータをXML文書に対応させます。行データが複数ある場合、テーブル名を親としたデータの固まりが複数存在することになります。列名が要素名となるか属性名となるかは、指定するオプションで異なります。テーブルとXML文書の関係を図で表すと図1のようになります。

図1 データベースとXML文書のマッピング

SQL Server 2000のデータをXML文書として取り出す

 さて、ここからは実際のSQL Server 2000の操作法を紹介していきましょう。SQL Server 2000からXML文書形式でデータを取り出す方法には、SELECTステートメントの「FOR XML」句を使う方法と、XPathクエリを使って取り出す方法があります。今回はFOR XML句を使ってデータを取り出す方法を紹介しましょう。

 FOR XML句は、SELECT文を記述するときのオプションとしてSQL Server 2000で新しく追加されたものです。SELECT文に「FOR XML」を追加指定することで、データベースから結果をXML文書として取り出せるようになっています。

 FOR XML句の構文は、以下のようになります。

SELECT … FOR XML [XMLモード] [, オプション[, オプション]]

 上記の構文に従ってテーブルの全データを取り出すSQL文を記述すると、以下のようになります。

SELECT * FROM テーブル名 FOR XML AUTO

 FOR XMLの後ろの“AUTO”はFOR XMLのオプションとして、「XMLモード」を指定しています。ほかに“RAW”と“EXPLICIT”があります。XMLモードは、取り出すXML文書の内容を指定するパラメータで、それぞれ次のような機能になっています。

RAW
テーブルの各行を、汎用の識別子“row”を要素とし、列を属性とした1つのXML要素に変換します。列名は属性名に使用され、XML要素の属性にマップされます。

AUTO
テーブルの各行について、テーブル名を要素とし列を属性とした1つのXML要素に変換します。列名は属性名に使用され、XML要素の属性にマップされます。さらにオプションを指定することで、結果を入れ子構造のXMLツリー形式にすることもできます。

EXPLICIT
データのスキーマ定義を明示的にSQL文の中に指定することができます。スキーマとデータ構造を対応させるため、ユニバーサルテーブルと呼ばれるテーブルの形式に合うように特殊なSQL文を構築する必要があります。

 さらにオプションとして、以下の記述を加えることができます。

XMLDATA
データのスキーマ定義を同時に生成します。

ELEMENTS
列は属性ではなく独立した子要素となります。AUTOモードでのみ有効です。

BINARY BASE64
バイナリデータを含む列があった場合、BASE64エンコードされて返されます。BINARY BASE64を指定しないでバイナリデータを含む列があった場合は、AUTOモードでは参照が返され、それ以外のモードではエラーになります。RAWモード、EXPLICITモードでバイナリデータを取得する場合はこの指定が必須です。

 オプションは、モードによって指定できない場合があるので注意してください。

FOR XML句でデータを取り出す

 今回はURLクエリを使ってデータを取り出してみます。URLクエリは、Webブラウザのアドレスに直接SQLステートメントを記述してデータを取り出す方法です。基本的な記述は、以下のようになっています(実際には1行として入力しますが、例では見やすさのために行を分割しています)。

http://サーバ名/仮想ディレクトリ名?sql=
SQL文 [&パラメータ=値 [&パラメータ=値 ……]]

 SQL文は、SQLステートメントまたはストアドプロシージャ名を記述します。SQLステートメントを記述するときは、空白文字の代わりに“+”を使います。パラメータは、“&”で区切って指定します。「FOR XML」を指定してXML文書としてデータを取り出す場合、XML文書のルート要素をパラメータで指定する必要があります。その場合、“&root=ルート要素名”と記述します。

 実際にデータを取り出してみます。先ほど作成したデータベースから、個人情報を取り出してみます。Webブラウザを起動して下記のURLクエリ文を入力します。

http://localhost/Person?sql=
SELECT+*+FROM+Person+FOR+XML+AUTO&root=Root

 結果は画面9のようになります。テーブル名が要素名となり、列が属性となって取り出されています。

画面9 データを取り出した結果。XMLモードがAUTOの場合

ELEMENTSオプションの指定

 次に、ELEMENTSオプションを指定して取り出してみます。記述は次のようになります。

http://localhost/Person?sql=
SELECT+*+FROM+Person+FOR+XML+AUTO, +ELEMENTS&root=Root

 結果は、画面10のようになります。今度はテーブル名を親要素、列を子要素としてXML文書を構築しています。

画面10 データの取り出し結果 - XMLモードがAUTOでELEMENTSオプションを指定した場合

RAWモードの指定

 次に、XMLモードをRAWにしてみます。記述は次のようになります。

http://localhost/Person?sql=
SELECT+*+FROM+Person+FOR+XML+RAW&root=Root

 結果は画面11のようになります。今度は親要素がrowになり、列を子要素としてXML文書を構築しています。

画面11 データを取り出した結果。XMLモードがRAWの場合

EXPLICITモードの指定

 最後に、XMLモードをEXPLICITにしてみます。記述は次のようになります。

http://localhost/Person?sql=
SELECT+1+as+Tag,NULL+as+Parent,氏名 +as+[Person!1!氏名],
年齢+as+[Person!1!年齢]+
FROM+Person+FOR+XML+EXPLICIT&root=ROOT

 結果は画面12のようになります。テーブル名が要素名となり、指定した「氏名」と「年齢」列のみを属性として取り出してきました。

画面12 データを取り出した結果。XMLモードがEXPLICITの場合

 「FOR XML」句を使ったデータの取り出しは、XMLモードとオプションの指定で変化します。今回実施したURLクエリでは、テーブル名を要素として列を属性にするパターンと、テーブル名を親要素として列を子要素にするパターン、そしてrowを要素にして列を属性にするパターンに分類できます。

 今回のように1つのテーブルでデータを表している場合はどの方法でも差はありませんが、複雑にリレーションが張られたテーブル構造の場合には構造に合った方法を選択するべきです。

 次回は取り出したデータを、XSLTを使ってスタイルに合わせて表示する方法を紹介します。今回はURLクエリでデータを取得しましたが、VBScriptやJScriptを使ってデータを取り出す方法についても紹介していきます。

2/7

Index
SQL ServerでXMLを操作する
  SQL Server 2000でXML機能を使えるようにする
・SQL Server 2000のXML対応機能とは?
・この記事で使用するデータ
・SQL Server 2000の設定
リレーショナルデータをXML文書として取り出す
・リレーショナルデータとXML文書のマッピング
・SQL ServerのデータをXML文書として取り出す
・FOR XML句でデータを取り出す
・ELEMENTSオプションの指定
・RAWモードの指定
・EXPLICITモードの指定
  クライアントサイド・スクリプトでSQL Serverを操作する
・サーバサイド・スクリプトとクライアントサイド・スクリプト

・スクリプトでデータを取り出す
・取り出したデータのXML文書化
  XSLTでXML文書をHTMLに変換
・XSLTスタイルシートの作成
・クライアントサイド・スクリプトからXSLTを呼び出す
・スクリプトをサーバサイド・スクリプトに作り替える
  XPathを使って、SQL Serverでクエリを実行する
・データベースをXML文書に見せかける
・ダイレクトにXPathを指定する方法
・テンプレートを使用する方法
・スキーマを使用する方法
  XML文書形式のデータをSQL Serverに格納する方法
・XML文書とテーブル構造の関係
・SQL文の構築(Insert文を構築する)
・サンプルプログラム
  ストアドプロシージャを利用したデータの追加
・OPENXMLの仕組み
・ストアドプロシージャの作成と呼び出し
・挿入されたデータを確認する
・Insert文とOPENXMLのどちらを使うべきか


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間