SQL Server 2005 で XML データ型を使用するサンプルを掲載します。
動作確認は SQL Server 2005 Develoer Edition で行っています。
下記にXMLデータ型を使用する上で便利なリンクを掲載しておきます。
SQL Server での XML の使用
http://msdn.microsoft.com/ja-jp/library/ms190936(SQL.90).aspx
XML データ型のメソッド
http://msdn.microsoft.com/ja-jp/library/ms190798(SQL.90).aspx
1. XMLデータタイプを使用する
XML型を列として持つ一時テーブルを作成します。このテーブルは本サンプルで使用していきます。サンプルでは、XMLフラグメントをCAST関数を使用して変数に設定し、一時テーブルにINSERTしてSELECTしています。
-- XML型の列を含む一時テーブルの作成
CREATE TABLE #XMLSampleTable
(
name nvarchar(100) NOT NULL,
xmlcol xml NULL
)
-- XML データタイプの宣言
DECLARE @xmlfragment as XML
SET @xmlfragment = CAST('<test name="naame">text</test><test name="naame">text</test>' as XML)
select @xmlfragment
-- データのINSERT
INSERT INTO #XMLSampleTable
VALUES( 'test', @xmlfragment)
SELECT *
from #XMLSampleTable
XMLデータは整形型です。XMLスキーマと関連付けるには、まず、CREATE XML SCHEMA COLLECTION を使用して、スキーマコレクションを作成し、スキーマを定義し、XMLデータ型の宣言時に関連付けを行います。下記サンプルでは、CREATE XML SCHEMA COLLECTION を使用してスキーマを定義するテンプレートと、作成済みのスキーマコレクションをsys.XML_schema_collections と 定義されたXMLネームスペースを sys.XML_schema_namespaces で確認するSQLも掲載しています。
作成したスキーマコレクションをサンプルで示すようにデータ型の定義時にスキーマコレクションを指定します。
-- XMLデータ型にXMLスキーマを関連付ける場合は -- スキーマコレクションを作成してスキーマを定義 CREATE XML SCHEMA COLLECTION [スキーマコレクション名] AS [スキーマ定義] -- スキーマコレクションを削除する DROP XML SCHEMA COLLECTION [スキーマコレクション名] -- XMLスキーマコレクションを列挙する select * from sys.XML_schema_collections -- XMLスキーマコレクションに含まれる -- スキーマのネームスペースを列挙する select * from sys.XML_schema_namespaces -- XMLスキーマが関連付けられたXMLデータ型を宣言する DECLARE @xmlfragment XML (DOCUMENT [スキーマコレクション名]) CREATE #XmlSample ( name nvarchar(100) NOT NULL, xmlcol xml ([スキーマコレクション名] NULL )
2. XMLデータ型の検索、修正
XMLデータ型の検索や編集は、専用の関数を使用します。存在確認はexist関数を、XMLデータに対してクエリを出す場合はquery関数を、クエリの値をSQL型に変換する場合はvalue関数を使用します。複数ノードをそれぞれの行として扱うにはnodes関数、データを修正するにはmodify関数を使用します。使用方法を下のサンプルに掲載します。詳細はサンプル冒頭のリンクを参照してください。
-- XMLデータを検索する
select *
from #XMLSampleTable
where xmlcol.exist('/test[@name="naame"]') = 1
select xmlcol.value('/test/text()[1]', 'nvarchar(10)')
from #XMLSampleTable
where xmlcol.exist('/test[@name="naame"]') = 1
select xmlcol.query('/test/text()')
from #XMLSampleTable
select xmlcol.value('(/test/@name)[1]', 'nvarchar(100)')
from #XMLSampleTable
select xmlcol.value('(/test/text())[1]', 'nvarchar(100)')
from #XMLSampleTable
DECLARE @xmlfragment1 as XML
SET @xmlfragment1 = CAST('<test name="naame">text</test><test name="naame">text1</test>' as XML)
select testcol.value('.','nvarchar(100)')
from @xmlfragment1.nodes('/test')
as XMLtest(testcol)
-- XMLデータタイプの修正
-- 詳細はBooks Online
UPDATE #XMLSampleTable
SET xmlcol.modify(' insert <test name="ins">insert test </test> into (/)[1]')
WHERE name='test'
select *
from #XMLSampleTable
3. XMLデータ型にインデックスを設定する
XMLデータ型には最大3つまでインデックスを設定できます。また、クラスタ化インデックスが設定されている必要があります。
インデックスはCREATE XML INDEXを使用します。定義テンプレートを下記に示します。また、XMLデータ列のインデックス情報はsys.XML_indexesカタログビューを使用することで確認できます。
-- XMLデータ型にインデックスを設定するばあい
CREATE XML INDEX [インデックス名]
-- SQL文を使用します。
-- XMLのインデックス情報を参照する場合は
select *
from sys.XML_indexes
where OBJECT_ID('dbo.XmlTest')
4.XMLと行レコードの変換
XMLとテーブルの行を相互に変換できます。SELECTした行セットをXMLに変換する場合はFOR XML を SELECT に指定します。XMLからテーブルの行を作成する場合はOPENXML関数とsp_XML_preparedocumentプロシージャを使用します。
下記にサンプルを掲載します。細かい追加オプションなどはBooks Online 等を参照願います。
-- テーブルをXMLに変換する
select TOP 2 *
from Article FOR XML AUTO
-- XMLからテーブルに変換する
DECLARE @xmlfragment2 as XML
SET @xmlfragment2 = CAST('<root><test name="naame">text</test><test name="naame">text1</test></root>' as XML)
DECLARE @xmlpointer int
EXEC sp_XML_preparedocument @xmlpointer OUTPUT, @xmlfragment2
SELECT colName
FROM OPENXML(@xmlpointer, '/root/test', 0)
WITH (colName nvarchar(10) '@name')
5. まとめ
今回の説明は以上です。誤り、指摘点などがありましたらご連絡ください。