XML データの取得
SQL Server では、XML インスタンスの内容は保持されますが、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 宣言 (<?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>