連載 SQL ServerでXMLを操作する
第3回:XPathを使って、
SQL Serverでクエリを実行する

SQL Serverへの問い合わせにはSQL言語を利用するのが普通だが、データベースの内容を仮想的にXML文書として見せることによって、XPathを利用した検索もできるようになる。今回は、そのXPathによる検索方法を解説する。

富士ソフトABC株式会社
技術センター
2002/6/26


XPathによるクエリ

 前回「第2回:リレーショナルDBから取り出したXML文書に、スタイルシートを適用する」は、スクリプトを使ってSQL ServerからデータをXML形式で取り出し、スタイルシート(XSLT)を適用してWebブラウザに表示する方法を紹介しました。今回はSQL Serverに対してSQL文ではなく、XPathを利用したクエリの実行を紹介します。

 XPathとはXML文書に対する検索を行う方法を定義した言語で、XPathによるクエリはXPathを使用した問い合わせのことです。XPathによりクエリを行う方法としては、ダイレクトに指定して行う方法とテンプレートとスキーマを利用する方法があります。

編集注:XPathについての詳しい解説は、連載「いまさら聞けない技術者のためのXML再入門」の「第8回 XML文書内の位置を正確に指し示すXPath」を参照のこと。

データベースをXML文書に見せ掛ける

XMLビューのイメージ
XMLビューを通してデータベースを参照すると、XML文書として見える(出典:「.NET Enterprise ServersのXML度を探る」)

 XPathは、XML文書に対する検索のために策定されたもので、リレーショナルデータベースに関する機能はいっさい含まれていません。そのため、SQL ServerではXPathに対応するために、リレーショナルデータベースのデータを巨大な1つのXML文書に見せる「XMLビュー」という機能を備えています。

 XMLビューによって仮想的に作られたXML文書に対してXPathを指定することでクエリが実行されます。SQL ServerのXMLビューについては、「.NET Enterprise ServersのXML度を探る」の記事中の「SQL Server 2000」を参照してください。

 SQL Server上の仮想的なXML文書を設定するために、この連載の「第1回:リレーショナルDBからXML文書を取り出す」の、「SQL Server 2000の設定」で説明した仮想名や仮想ディレクトリを使用します。

 XPathによるクエリは、ダイレクトにXPathを記述するか、もしくは格納したテンプレートとスキーマを通してデータを取り出す形になっています。ダイレクトにXPathを記述する場合は、その対象として、第1回で設定した仮想名の“dbobj”を使用します。このdbobjの下に仮想的なXML文書があたかも存在するように見えます。

 テンプレートとスキーマを利用して問い合わせる場合は、仮想ディレクトリにテンプレートなどのファイルを格納したうえで呼び出します。このとき、テンプレートは“template型”で指定したディレクトリに、スキーマは“schema型”で指定したディレクトリにそれぞれ格納します。テンプレートやスキーマは、検索結果のフォーマットを指定するときなどに使うものです。

 では、それぞれの使用例を挙げていきます。

ダイレクトにXPathを指定する方法

 ダイレクトにXPathによるクエリを記述する方法の場合、Webブラウザのアドレスバーに以下のようなURLを入力します。

http://localhost/Person/dbobj/Person/@Name

 すると、SQL Serverに対して問い合わせが実行され、結果は画面1のように表示されます。XPathを使ってSQL Serverに問い合わせができることがお分かりでしょう。このURLの記述はローカルホストの“Person”という仮想ディレクトリに設定された仮想名“dbobj”を使用して、“Person”テーブルにアクセスし、カラム名“Name”のデータを取り出すことを表しています。

画面1 ダイレクトにXPathを指定した場合の結果

 この記述では条件を指定していませんが、次のような条件を指定することでデータを抽出して取り出すことができます。

http://localhost/Person/dbobj/Person[@Age>'40']/@Name

 この場合、“Age”が40より上の条件を加えました。結果は画面2のように表示されます。条件を記述する場合は、テーブル名の後に“[]”で囲います。表示された結果が文字化けしている場合は、エンコードをUnicode(UTF-8)に変更すると正しく表示されます。

画面2 XPathに条件を追加した結果

テンプレートを使用する方法

 テンプレートを使用したXPathのクエリを行うには、次に説明するスキーマも同時に使用する必要があります。まずはテンプレートを使用したクエリの方法について説明し、スキーマを使ったクエリについて説明をした後にXPathによるクエリを説明します。

 テンプレートを使用したクエリとは、SQL文をクエリ用のXML文書でラッピングして呼び出す方法のことです(つまり中身はSQL文です)。テンプレートを使用する場合は、後述のテンプレートファイル(例では “Person1.xml”を使用)を仮想ディレクトリに格納して、以下のようなURLをWebブラウザのアドレスバーに入力します。結果は画面3のように表示されます。

http://localhost/Person/tp/Person1.xml

画面3 テンプレートを使用したクエリの結果

 このURLの記述は、ローカルホストの“Person”という仮想ディレクトリにあるテンプレート用のディレクトリ“tp”に格納されている“Person1.xml”というテンプレートを使用して、データを取り出すことを表しています。このテンプレートファイルには下記の内容が記述されています。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:query>
SELECT * FROM Person FOR XML AUTO
</sql:query>
</ROOT>
“Person1.xml”の内容

 内容を見ると、前回「リレーショナルDBから取り出した XML文書に、スタイルシートを適用する」の説明でスクリプト内に記述したSQL文と同じであることが分かります。SQL文の結果がXML文書として取り出せる、というわけです。

スキーマを使用する方法

 スキーマを定義しておくことで、検索結果として取り出すXML文書の形式を決めることができます。スキーマを使用する場合は後述のスキーマファイル、この例では“Person2.xml”を仮想ディレクトリに格納して、以下のようにWebブラウザのアドレスバーにURLを入力すると、結果は画面4のように表示されます。

http://localhost/Person/sch/Person2.xml/Person?root=ROOT

画面4 スキーマを使用したクエリの結果

 このURLの記述は、ローカルホストの“Person”という仮想ディレクトリにあるスキーマ用のディレクトリ“sch”に格納されている“Person2.xml”というスキーマを使用して、“Person”テーブルからデータを取り出すことを表しています。後ろの“?”以降に記述されている “root=ROOT”は、取り出したデータをXML文書にしたときのルート要素名を指定しています。

 “root=Person”と指定すれば、ルート要素名は“Person”になります(画面5)。

画面5 ルート要素名を“Person”にした場合

 このスキーマファイルには下記の内容が記述されています。

<?xml version="1.0" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes"
xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<ElementType name="Person" sql:relation="Person">
<AttributeType name="Name" />
<AttributeType name="Age" />
<AttributeType name="PostalCode" />
<AttributeType name="State" />
<AttributeType name="City" />
<AttributeType name="Address" />
<AttributeType name="Building" />
<AttributeType name="Phone" />
<AttributeType name="MailAddr" />

<attribute type="Name" sql:field="Name" />
<attribute type="Age" sql:field="Age" />
<attribute type="PostalCode" sql:field="PostalCode" />
<attribute type="State" sql:field="State" />
<attribute type="City" sql:field="City" />
<attribute type="Address" sql:field="Address" />
<attribute type="Building" sql:field="Building" />
<attribute type="Phone" sql:field="Phone" />
<attribute type="MailAddr" sql:field="MailAddr" />
</ElementType>
</Schema>
“Person2.xml”の内容

 スキーマファイルの内容は、取り出したいデータの定義になっています。取り出すテーブル名を要素名として定義し、カラムを属性として定義します。このとき取り出したいカラムについてのみ定義すれば、そのデータだけが取り出せます。この例では、すべてのカラムのデータを取り出せるように定義しています。

 最初に名前空間を定義しています。この記述をそのまま覚えていいでしょう。次に要素の定義をしています。この例では要素名に“Person”を指定しています。要素を指定するときにデータを取り出すテーブルを指定します。ここでは“Person”テーブルからデータを取り出すように指定しています。あとは取り出したいカラムについての定義を属性として記述していきます。

 まずは“AttributeType”で属性名を定義します。属性名の定義がすべて終了したら、定義した属性名に対するカラム名を定義します。そして、“attribute”を使って“AttributeType”で定義した属性名に対して“sql:field”属性でカラム名をマッピングしていきます。こうすることでXML文書としてデータを構築することが可能となるわけです。

テンプレートとスキーマを使用したXPathによるクエリ

 テンプレートとスキーマの両方を使用したXPath形式のクエリの例を紹介しましょう。後述のテンプレートファイル(例では“Person3.xml”を使用)を仮想ディレクトリに格納して、以下のようなURLをWebブラウザのアドレスバーに入力すると、結果は画面6のように表示されます。

http://localhost/Person/tp/Person3.xml

画面6 テンプレートとスキーマを使用したXPathによるクエリの結果

 このURLの記述は、ローカルホストの“Person”という仮想ディレクトリにあるテンプレート用のディレクトリ“tp”に格納されている“Person3.xml”というテンプレートを使用して、データを取り出すことを表しています。このテンプレートファイルには下記の内容が記述されています。

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">
<sql:xpath-query mapping-schema="../sch/Person2.xml">
Person
</sql:xpath-query>
</ROOT>
“Person3.xml”の内容

 内容を見ると、先ほど説明したテンプレートファイルとは少し違いがあります。先ほどは“<sql:query>”タグでSQL文を定義していましたが、こちらは“<sql:xpath-query>”タグでXPathクエリ文を定義しています。

 ファイルの2行目の“<sql:xpath-query>”タグの“mapping-schema”属性で、使用するスキーマファイルを指定します。ここでは先ほど使用した“Person2.xml”を指定しています。次にXPathクエリ文を記述します。この例では単に “Person”というテーブル名だけを記述しています。こうするとテーブル内のすべてのデータを取り出すことになります。条件を付ける場合は、テーブル名の後に“[]”で囲って記述します。例えば“Person[@Age>50]”と記述すれば、“Age”が50より上のデータを抽出することになります(画面7)。

画面7 条件を付けたクエリの結果

 SQL Serverに備えられたXML機能による、XPathを使ってのクエリについて説明してきました。次回は、XML文書をSQL Serverに追加する方法を紹介しましょう。

関連記事

XML文書内の位置を正確に指し示すXPath(連載「いまさら聞けない技術者のためのXML再入門」)
.NET Enterprise ServersのXML度を探る


5/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 記事ランキング

本日月間