xml データ型

xml データ型を使用すると、XML ドキュメントやそのフラグメントを SQL Server データベースに保存できます。XML フラグメントとは、単一の最上位要素を欠いた XML インスタンスです。XML インスタンスは xml 型の列および変数を作成して、そこに保存できます。保存する xml データ型のインスタンスは 2 GB 以内である必要があります。

必要に応じて、xml データ型の列、パラメータ、または変数に XML スキーマ コレクションを関連付けることができます。コレクション内のスキーマは、XML インスタンスの検証および型指定に使用されます。スキーマが使用されている場合、XML は型指定されているといいます。

xml データ型および関連するメソッドが実装されていることで、SQL Server のリレーショナル データベース フレームワークに XML を統合できます。詳細については、「xml データ型のメソッド」を参照してください。

ms189887.note(ja-jp,SQL.90).gifメモ :
このトピックでは型指定されていない XML について説明します。型指定された XML の詳細については、「型指定された XML と型指定されていない XML」を参照してください。

xml データ型の変数と列の作成

xml データ型は SQL Server に組み込まれたデータ型の 1 つであり、intvarchar などの他の組み込みのデータ型と類似する部分があります。他の組み込みの型と同じく、xml データ型はテーブルを作成するときに列の型として変数の型、パラメータの型、および関数の戻り値の型と同様に使用したり、CAST および CONVERT で使用できます。これらの使い方を次の例で説明します。

例 A

xml 型の列を作成します。

CREATE TABLE T1(Col1 int primary key, Col2 xml) 

例 B

xml 型の変数を作成します。

DECLARE @x xml 

XML スキーマ コレクションを指定して、型指定された xml 変数を作成します。

declare @x xml (Sales.StoreSurveySchemaCollection)

例 C

xml 型のパラメータをストアド プロシージャに渡します。

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ... 

XQuery を使用して、列、パラメータ、または変数に格納されている XML インスタンスにクエリを実行できます。また、XML DML (データ操作言語) を使用して、XML インスタンスに更新を適用することもできます。SQL Server の開発時点では XQuery 標準に XQuery DML が定められていなかったので、XQuery については XML DML (XML データ変更言語) 拡張機能が実装されています。この拡張機能を使用して、挿入、更新、および削除を実行できます。

既定の XML の割り当て

テーブル内で、xml 型の列に、既定の XML インスタンスを割り当てることができます。既定の XML を割り当てるには、次に示す 2 とおりのうち、いずれかの方法を使用します。

例 A

既定の XML を XML 定数として指定します (文字列は暗黙的に xml 型にキャストされます)。

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

例 B

既定の XML を明示的な CAST として xml に指定します。

CREATE TABLE T (XmlColumn xml 
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server では、xml 型の列に対する NULL 制約および NOT NULL 制約もサポートされます。次に例を示します。

CREATE TABLE T (XmlColumn xml NOT NULL)

制約の指定

xml 型の列を作成するときには、列レベルまたはテーブル レベルの制約を定義できます。ただし、制約を指定するとき、XML データ型のメソッドは使用できません。その代わりに、次の例に示すように、xml データ型のメソッドをラップするためのラッパーと呼ばれるユーザー定義関数を作成し、ユーザー定義関数を CHECK 制約を適用して指定します。

次の例では、Col2 列に対して、保存する各 XML インスタンスには ProductID 属性を持つ <ProductDescription> 要素が必要であるという制約を指定します。この制約は、次のユーザー定義関数によって適用されます。

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN 
RETURN @var.exist('/ProductDescription/@ProductID')
END
GO

インスタンスの <ProductDescription> 要素に ProductID 属性が含まれる場合、xml データ型の exist() メソッドは 1 を返します。それ以外の場合は、0 を返します。

ここで、次のようにして列レベルの制約を定義したテーブルを作成できます。

CREATE TABLE T (
    Col1 int primary key, 
    Col2 xml check(dbo.my_udf(Col2)=1))
GO

次の挿入操作は成功します。

INSERT INTO T values(1,'<ProductDescription ProductID="1" />')

次の挿入操作は制約に違反するため失敗します。

INSERT INTO T values(1,'<Product />')

テーブルの変更

xml データ型は ALTER TABLE ステートメントでサポートされています。たとえば、文字列型の列を xml データ型に変更できます。このような場合、列に格納されるドキュメントは正しい形式でなければなりません。また、列の型を文字列から型指定された xml に変更する場合、列内のドキュメントは指定した XSD スキーマに対して検証されます。

CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))
GO
INSERT INTO T 
VALUES (1, '<Root><Product ProductID="1"/></Root>')
GO
ALTER TABLE T 
ALTER COLUMN Col2 xml
GO

xml 型の列は、型指定されていない XML から型指定された XML に変更できます。次に例を示します。

CREATE TABLE T (Col1 int primary key, Col2 xml)
GO
INSERT INTO T 
values (1, '<p1:ProductDescription ProductModelID="1" 
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
            </p1:ProductDescription>')
GO 
-- Make it a typed xml column by specifying a schema collection.
ALTER TABLE T 
ALTER COLUMN Col2 xml (Production.ProductDescriptionSchemaCollection)
GO
ms189887.note(ja-jp,SQL.90).gifメモ :
このスクリプトは AdventureWorks データベースに対して実行されます。これは、XML スキーマ コレクション Production.ProductDescriptionSchemaCollectionAdventureWorks データベースの一部として作成されるからです。

上記の例では、列に保存されているすべてのインスタンスは指定したコレクションの XSD スキーマで検証と型指定が行われます。指定したスキーマに適合しない XML インスタンスが列に含まれている場合、ALTER TABLE ステートメントは失敗するので、型指定されていない XML 列を型指定された XML に変更することができません。

ms189887.note(ja-jp,SQL.90).gifメモ :
大きなテーブルの場合、xml 型の列を変更すると処理の負担が大きくなることがあります。これは、各ドキュメントについて、形式が正しいか、型指定された XML であるかどうかを検証する必要があるためです。

型指定された XML の詳細については、「型指定された XML と型指定されていない XML」を参照してください。

ビューの作成

xml 型の列を使用して、ビューを作成することもできます。次の例で、xml データ型の value() メソッドを使用して xml 型の列の値を取得するビューを作成します。

-- Create the table.
CREATE TABLE T (
    ProductID          int primary key, 
    CatalogDescription xml)
GO
-- Insert sample data.
INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')
GO
-- Create view (note the value() method used to retrieve ProductName 
-- attribute value from the XML).
CREATE VIEW MyView AS 
  SELECT ProductID,
         CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName
  FROM T
GO 

このビューに対し、次のクエリを実行します。

SELECT * 
FROM   MyView

次に結果を示します。

ProductID   PName      
----------- ------------
1           SomeName 
ms189887.note(ja-jp,SQL.90).gifメモ :
分散パーティション ビューには xml データ型を使用できません。

計算列での XML の使用

XML インスタンスは、計算列のソースとして、または計算列の一種として使用できます。たとえば、次の CREATE TABLE ステートメントでは、col1 から xml 型の列 (col2) を計算しています。

CREATE TABLE T(col1 varchar(max), col2 AS CAST(col1 AS xml) )  

次の CREATE TABLE ステートメントで示すように、xml データ型は計算列を作成するときのソースとしても使用できます。

CREATE TABLE T (col1 xml, col2 as cast(col1 as varchar(1000) )) 

次の例に示すように、xml 型の列から値を抽出して計算列を作成できます。計算列を作成するときは xml データ型のメソッドを直接使用できません。そのため、この例では XML インスタンスの値を返す関数 (my_udf) をまず定義しています。この関数には、xml 型の value() メソッドがラップされています。CREATE TABLE ステートメントで、この関数名が計算列の代わりに指定されています。

CREATE FUNCTION my_udf(@var xml) returns int
AS BEGIN 
RETURN @var.value('(/ProductDescription/@ProductModelID)[1]' , 'int')
END
GO
-- Use the function in CREATE TABLE.
CREATE TABLE T (col1 xml, col2 as dbo.my_udf(col1) )
GO
-- Try adding a row. 
INSERT INTO T values('<ProductDescription ProductModelID="1" />')
GO
-- Verify results.
SELECT col2, col1
FROM T
 

上記の例と同様に、次の例では計算列用に xml 型のインスタンスを返す関数を定義しています。関数内では、xml データ型の query() メソッドにより xml 型のパラメータの値を取得しています。

CREATE FUNCTION my_udf(@var xml) 
  RETURNS xml AS 
BEGIN 
   RETURN @var.query('ProductDescription/Features')
END

次の CREATE TABLE ステートメントの Col2 は、関数が返した XML データ (<Features> 要素) を使用する計算列です。

CREATE TABLE T (Col1 xml, Col2 as dbo.my_udf(Col1) )
-- Insert a row in table T.
INSERT INTO T VALUES('
<ProductDescription ProductModelID="1" >
  <Features>
    <Feature1>description</Feature1>
    <Feature2>description</Feature2>
  </Features>
</ProductDescription>')
-- Verify the results.
SELECT *
FROM T

参照

関連項目

FOR XML および OPENXML の使用による XML データのパブリッシュと処理

概念

型指定された XML と型指定されていない XML
XML インスタンスの生成
XML DML (XML データ変更言語)
xml データ型列のインデックス
サンプル XML アプリケーション

その他の技術情報

xml データ型のメソッド

ヘルプおよび情報

SQL Server 2005 の参考資料の入手