この例では、EXPLICIT モードを使用して、SELECT
ステートメントで XMLTEXT
ディレクティブを使用して、オーバーフロー列のデータがどのように対処されるかを示します。
Person
テーブルについて考えてみましょう。 このテーブルには、XML ドキュメントの未使用の部分を格納する Overflow
列があります。
USE tempdb;
GO
CREATE TABLE Person(PersonID varchar(5), PersonName varchar(20), Overflow nvarchar(200));
GO
INSERT INTO Person VALUES
('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')
,('P2','Joe',N'<SomeTag attr2="data"/>')
,('P3','Joe',N'<SomeTag attr3="data" PersonID="P">content</SomeTag>');
このクエリは、 Person
テーブルから列を取得します。
Overflow
列の場合、AttributeName は指定されていませんが、ディレクティブはユニバーサル テーブルの列名の指定の一部としてXMLTEXT
に設定されます。
SELECT 1 as Tag, NULL as parent,
PersonID as [Parent!1!PersonID],
PersonName as [Parent!1!PersonName],
Overflow as [Parent!1!!XMLTEST] -- No AttributeName; XMLTEXT directive
FROM Person
FOR XML EXPLICIT;
結果の XML ドキュメントでは、次の手順を実行します。
Overflow
列に AttributeName が指定されておらず、xmltext
ディレクティブが指定されているため、<overflow
>要素内の属性は、外側の<Parent
>要素の属性リストに追加されます。<
xmltext
>要素のPersonID
attribute は、同じ要素レベルで取得されたPersonID
属性と競合するため、PersonID
が NULL の場合でも、<xmltext
>要素内の属性は無視されます。 一般に、属性はオーバーフロー内の同じ名前の属性をオーバーライドします。
結果を次に示します。
<Parent PersonID="P1" PersonName="Joe" attr1="data">content</Parent>
<Parent PersonID="P2" PersonName="Joe" attr2="data"></Parent>
<Parent PersonID="P3" PersonName="Joe" attr3="data">content</Parent>
オーバーフロー データにサブ要素があり、同じクエリが指定されている場合、 Overflow
列のサブ要素は、外側の <Parent
> 要素のサブ要素として追加されます。
たとえば、Overflow
列にサブ要素が含まれるように、Person
テーブルのデータを変更します。
USE tempdb;
GO
TRUNCATE TABLE Person;
GO
INSERT INTO Person VALUES
('P1','Joe',N'<SomeTag attr1="data">content</SomeTag>')
,('P2','Joe',N'<SomeTag attr2="data"/>')
,('P3','Joe',N'<SomeTag attr3="data" PersonID="P"><name>PersonName</name></SomeTag>');
同じクエリが実行された場合、 <xmltext
> 要素内のサブ要素は、外側の <Parent
> 要素のサブ要素として追加されます。
SELECT 1 as Tag, NULL as parent,
PersonID as [Parent!1!PersonID],
PersonName as [Parent!1!PersonName],
Overflow as [Parent!1!!XMLTEXT] -- no AttributeName, XMLTEXT directive
FROM Person
FOR XML EXPLICIT;
結果を次に示します。
<Parent PersonID="P1" PersonName="Joe" attr1="data">content</Parent>
<Parent PersonID="P2" PersonName="Joe" attr2="data"></Parent>
<Parent PersonID="P3" PersonName="Joe" attr3="data">
<name>PersonName</name>
</Parent>
AttributeName が xmltext
ディレクティブで指定されている場合、<overflow
>要素の属性は、外側の<Parent
>要素のサブ要素の属性として追加されます。
AttributeName に指定された名前は、サブ要素の名前になります。
このクエリでは、 AttributeName<overflow
>は、 xmltext
ディレクティブと共に指定されます。
SELECT 1 as Tag, NULL as parent,
PersonID as [Parent!1!PersonID],
PersonName as [Parent!1!PersonName],
Overflow as [Parent!1!overflow!XMLTEXT] -- Overflow is AttributeName
-- XMLTEXT is a directive
FROM Person
FOR XML EXPLICIT
結果を次に示します。
<Parent PersonID="P1" PersonName="Joe">
<overflow attr1="data">content</overflow>
</Parent>
<Parent PersonID="P2" PersonName="Joe">
<overflow attr2="data" />
</Parent>
<Parent PersonID="P3" PersonName="Joe">
<overflow attr3="data" PersonID="P">
<name>PersonName</name>
</overflow>
</Parent>
このクエリ要素では、 ディレクティブ は PersonName
属性に指定されます。 これにより、外側の<Parent
>要素のサブ要素としてPersonName
が追加されます。
<
xmltext
>の属性は、外側の<Parent
>要素に引き続き追加されます。
<
overflow
>要素のサブ要素の内容は、囲んでいる<Parent
>要素の他のサブ要素の前に追加されます。
SELECT 1 AS Tag, NULL as parent,
PersonID AS [Parent!1!PersonID],
PersonName AS [Parent!1!PersonName!element], -- element directive
Overflow AS [Parent!1!!XMLTEXT]
FROM Person
FOR XML EXPLICIT;
結果を次に示します。
<Parent PersonID="P1" attr1="data">content<PersonName>Joe</PersonName>
</Parent>
<Parent PersonID="P2" attr2="data">
<PersonName>Joe</PersonName>
</Parent>
<Parent PersonID="P3" attr3="data">
<name>PersonName</name>
<PersonName>Joe</PersonName>
</Parent>
XMLTEXT
列データにルート要素の属性が含まれている場合、これらの属性は XML データ スキーマに表示されず、MSXML パーサーは結果の XML ドキュメント フラグメントを検証しません。 例えば次が挙げられます。
SELECT 1 AS Tag,
0 ASParent,
N'<overflow a="1"/>' AS 'overflow!1!!xmltext'
FOR XML EXPLICIT, xmldata;
結果は次のとおりです。 返されるスキーマでは、 a
オーバーフロー属性がスキーマに含まれていないことに注意してください。
<Schema name="Schema2"
xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="overflow" content="mixed" model="open">
</ElementType>
</Schema>
<overflow xmlns="x-schema:#Schema2" a="1">
</overflow>