次の方法で共有


例: XMLTEXT ディレクティブの指定

この例では、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 >要素の PersonIDattribute は、同じ要素レベルで取得された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>

AttributeNamexmltext ディレクティブで指定されている場合、<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>

こちらもご覧ください

FOR XML で EXPLICIT モードを使用する