型指定された XML と型指定されていない XML を比較する

適用対象:yesSQL Server (サポートされているすべてのバージョン) YesAzure SQL Database

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

整形式 XML と XML データ型

xml データ型には、ISO 標準の xml データ型が実装されています。 したがって、型指定されていない XML 列には、適切な形式の XML Version 1.0 ドキュメントを保存できるほか、テキスト ノードや任意の数の最上位要素が含まれた、いわゆる XML コンテンツ フラグメントを保存することもできます。 システムは、データが整形式であるか、列を XML スキーマにバインドする必要もないことを確認し、拡張された意味で整形式ではないデータを拒否します。 このことは、型指定されていない XML の変数やパラメーターにも該当します。

XML スキーマ

XML スキーマでは、次のものが提供されます。

  • 検証制約。 型指定された xml インスタンスが割り当てまたは変更されるときは、常に、SQL Server によってそのインスタンスが検証されます。

  • データ型情報。 スキーマでは、 xml データ型のインスタンス内の属性と要素の型に関する情報が提供されます。 この型情報により、インスタンスに含まれている値には、型指定されていない xmlより正確な演算のセマンティクスが提供されます。 たとえば、10 進数の算術演算は 10 進数値では実行できますが、文字列値では実行できません。 スキーマで型情報が指定されるので、型指定された XML ストレージは、型指定されていない XML よりも大幅に小さくすることができます。

型指定された XML または型指定されていない XML の選択

次の条件に該当する場合は、型指定されていない xml データ型を使用してください。

  • XML データのスキーマがありません。

  • スキーマはありますが、サーバーでデータを検証する必要はありません。 これは、アプリケーションがサーバーにデータを格納する前にクライアント側の検証を実行したり、スキーマに従って無効な XML データを一時的に格納したり、サーバーでサポートされていないスキーマ コンポーネントを使用したりする場合に発生することがあります。

次の条件に該当する場合は、型指定されている xml データ型を使用してください。

  • 使用する XML データのスキーマがあり、その XML スキーマに従ってサーバーで XML データを検証する場合。

  • 型情報を基にしたストレージやクエリの最適化を行う場合。

  • クエリをコンパイルするときに型情報を使用する場合。

型指定された XML の列、パラメーター、および変数には、XML ドキュメントまたは XML コンテンツを保存できます。 ただし、宣言時にドキュメントまたはコンテンツを格納するかどうかに関わらず、フラグを指定する必要があります。 また、XML スキーマのコレクションを指定する必要があります。 各 XML インスタンスの最上位要素が 1 つだけの場合、DOCUMENT を指定します。 それ以外の場合は CONTENT を指定します。 クエリのコンパイルで型を確認するとき、クエリ コンパイラにより DOCUMENT フラグが使用され、シングルトンの最上位要素が推測されます。

型指定された XML の作成

型指定された XML 変数、パラメーター、または列を作成するには、まず CREATE XML SCHEMA COLLECTION (Transact-SQL) を使用して XML スキーマ コレクションを登録する必要があります。 その後、XML スキーマ コレクションを xml データ型の変数、パラメーター、または列に関連付けることができます。

次の例では、XML スキーマ コレクション名を指定する際に、2 つの要素で構成された名前付け規則が使用されます。 最初の要素はスキーマ名で、2 番目の要素は XML スキーマ コレクション名です。

例: スキーマ コレクションと XML 型変数の関連付け

次の例では、xml 型の変数を作成し、それにスキーマ コレクションを関連付けます。 例で指定されているスキーマ コレクションは、 AdventureWorks のデータベースに既にインポートされています。

DECLARE @x xml (Production.ProductDescriptionSchemaCollection);

例: xml 型列のスキーマの指定

次の例では、 xml 型の列を持つテーブルを作成し、列のスキーマを指定します。

CREATE TABLE T1(
Col1 int,
Col2 xml (Production.ProductDescriptionSchemaCollection));

例: XML 型パラメーターをストアド プロシージャに渡す

次の例では、 xml 型のパラメーターをストアド プロシージャに渡し、変数にスキーマを指定します。

CREATE PROCEDURE SampleProc
  @ProdDescription xml (Production.ProductDescriptionSchemaCollection)
AS
...

XML スキーマ コレクションに関して次の点に注意してください。

  • XML スキーマ コレクションは、「 CREATE XML SCHEMA COLLECTION (Transact-SQL)」を使用して登録されたデータベースでのみ使用できます。

  • 文字列から型指定された xml データ型にキャストする場合、指定したコレクションの XML スキーマの名前空間に基づいて、解析時に検証と型指定も行われます。

  • 型指定された xml データ型から、型指定されていない xml データ型にキャストできます。その逆も可能です。

SQL Server で XML を生成するその他の方法の詳細については、「 XML データのインスタンスの作成」を参照してください。 XML を生成後、それを xml データ型の変数に代入できます。また、その後の処理のために xml 型の列に格納することもできます。

データ型の階層では、 xml データ型は sql_variant やユーザー定義型の下、組み込み型の上に表示されます。

例: 型指定された XML 列を制約するファセットの指定

型指定された xml 列では、格納されているインスタンスごとに、最上位要素を 1 つだけ許可するように、列を制約できます。 これを行うには、次の例で示すように、テーブルを作成するときに、オプションの DOCUMENT ファセットを指定します。

CREATE TABLE T(Col1 xml
   (DOCUMENT Production.ProductDescriptionSchemaCollection));
GO
DROP TABLE T;
GO

既定では、型指定された xml 列に格納されるインスタンスは、XML ドキュメントではなく、XML コンテンツとして格納されます。 これにより、次のことが可能になります。

  • ゼロ (0) 個以上の最上位要素

  • 最上位要素のテキスト ノード

また、次の例に示すように、 CONTENT ファセットを追加することにより、この動作を明示的に指定することもできます。

CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection));
GO -- Default

省略可能な DOCUMENT/CONTENT ファセットは、xml 型 (型指定された xml ) を定義する任意の場所で指定できます。 たとえば、型指定された xml 変数を作成するときに、次に示すように DOCUMENT/CONTENT ファセットを追加できます。

declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);

DTD (文書型定義)

xml データ型の列、変数、およびパラメーターは XML スキーマを使用して型指定できますが、DTD では型指定できません。 ただしインライン DTD は型指定された XML にも型指定されていない XML にも使用できるので、それを使用して既定値を指定したり、エンティティ参照を展開した形に置き換えることができます。

サード パーティのツールを使用すると、DTD を XML スキーマ ドキュメントに変換できます。変換した XML スキーマはデータベースに読み込むことができます。

型指定された XML の SQL Server 2005 からのアップグレード

SQL Server 2008 では、lax 検証のサポート、 xs:datexs:time 、および xs:dateTime のインスタンス データの処理の強化、list 型と union 型のサポートの追加など、XML スキーマのサポートがいくつかの点で拡張されています。 ほとんどの場合、変更はアップグレード エクスペリエンスに影響しません。 ただし、 SQL Server 2005 (9.x) で、 xs:date型、 xs:time型、または xs:dateTime 型 (またはこれらのサブタイプ) の値を許可する XML スキーマ コレクションを使用していた場合は、その SQL Server 2005 (9.x) データベースを SQL Server以降のバージョンにアタッチすると、以下のアップグレード手順が実行されます。

  1. XML スキーマ コレクションに xs:anyTypexs:anySimpleTypexs:date (またはそのサブタイプ)、 xs:time (またはそのサブタイプ)、または xs:dateTime (またはそのサブタイプ) として型指定されている要素や属性、あるいはこれらの型を含む union 型または list 型の要素や属性が含まれる場合、その XML スキーマ コレクションで型指定されているすべての XML 列で、次の状況が発生します。

    1. 列のすべての XML インデックスが無効になります。

    2. すべての SQL Server 2005 (9.x) 値は、Z タイムゾーンに正規化されているため、引き続き Z タイムゾーンで表されます。

    3. 1 年 1 月 1 日より小さい xs:date または xs:dateTime 値を指定すると、インデックスが再構築されるか、その値を含む xml データ型に対して XQuery または XML-DML ステートメントが実行されると、ランタイム エラーが発生します。

  2. XML スキーマ コレクションの xs:date ファセットまたは xs:dateTime ファセットまたは既定値の負の年は、xs:date 型または xs:dateTime 型で許容される最小値に自動的に更新されます (たとえば、xs:dateTime の場合は 0001-01-01T00:00:00.0000000Z)。

負の年が含まれている場合でも、Transact-SQL SELECT ステートメントを使用して XML データ型全体を取得できます。 負の年を新しくサポートされる範囲内の年に置き換えるか、要素または属性の型を xs:string に変更することをお勧めします。

こちらもご覧ください