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. まとめ
今回の説明は以上です。誤り、指摘点などがありましたらご連絡ください。
さんのコメント: さんのコメント: