XML クエリ オプションと保持されるデータ
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance
この記事では、XML データのクエリを実行するために指定する必要があるクエリ オプションについて説明します。 また、XML インスタンスをデータベースに格納するときに保持されない部分についても説明します。
必要なクエリ オプションを設定する
xml データ型メソッドを使用して xml 型の列や変数のクエリを行うときは、次のようにオプションを設定する必要があります。
SET オプション | 設定する値 |
---|---|
ANSI_NULLS | ON |
ANSI_PADDING | ON |
ANSI_WARNINGS | ON |
ARITHABORT | ON |
CONCAT_NULL_YIELDS_NULL | ON |
NUMERIC_ROUNDABORT | OFF |
QUOTED_IDENTIFIER | ON |
オプションが上記のように設定されていない場合は、 xml データ型メソッドのクエリや変更は失敗します。
保持されない XML インスタンスの機能
SQL Server では、XML インスタンスの内容は保持されますが、XML データ モデルで重要と見なされない側面は保持されません。 つまり、取得した XML インスタンスは、サーバーに格納されたインスタンスと同一とは限りませんが、含まれている情報は同じです。
XML 宣言
インスタンスをデータベースに格納する場合は、そのインスタンスの XML 宣言は保持されません。 次に例を示します。
CREATE TABLE T1 (Col1 int primary key, Col2 xml);
GO
INSERT INTO T1 values (1, '<?xml version="1.0" encoding="windows-1252" ?><doc></doc>');
GO
SELECT Col2
FROM T1;
結果は <doc/>
になります。
<?xml version='1.0'?>
などの XML 宣言は、XML データを xml データ型インスタンスに格納するときに保持されません。 これは仕様です。 XML 宣言 () とその属性 (version/encoding/stand-alone) は、データを xml型に変換すると失われます。 XML 宣言は、XML パーサーが使用するディレクティブとして扱われます。 XML データは、ucs-2 として内部的に保存されます。 XML インスタンスのその他すべての PI は保持されます。
属性の順序
XML インスタンス内の属性の順序は保持されません。 xml 型の列に格納されている XML インスタンスにクエリを実行する場合、結果の XML の属性の順序は元の XML インスタンスとは異なる場合があります。
属性値を囲む引用符
属性を囲む単一引用符および二重引用符は、保持されません。 属性値は、名前と値の組としてデータベースに格納されます。 引用符は格納されません。 XML インスタンスに対して XQuery を実行すると、結果の XML はシリアル化され、属性が二重引用符で囲まれます。
DECLARE @x xml;
-- Use double quotation marks.
SET @x = '<root a="1" />';
SELECT @x;
GO
DECLARE @x xml;
-- Use single quotation marks.
SET @x = '<root a=''1'' />';
SELECT @x;
GO
どちらのクエリからも、 <root a="1" />
が返されます。
名前空間プレフィックス
名前空間プレフィックスは保持されません。 xml 型の列に対して XQuery を指定した場合、結果のシリアル化された XML は、異なる名前空間プレフィックスを返す可能性があります。
DECLARE @x xml;
SET @x = '<ns1:root xmlns:ns1="abc" xmlns:ns2="abc">
<ns2:SomeElement/>
</ns1:root>';
SELECT @x;
SELECT @x.query('/*');
GO
結果の名前空間プレフィックスは、異なる可能性があります。 次に例を示します。
<p1:root xmlns:p1="abc"><p1:SomeElement/></p1:root>