連載 SQL
ServerでXMLを操作する
第3回:XPathを使って、
SQL Serverでクエリを実行する
富士ソフト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"> |
“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" ?> |
“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"> |
“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のどちらを使うべきか |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|