Freigeben über


Beispiel: Angeben der XMLTEXT-Anweisung

In diesem Beispiel wird veranschaulicht, wie Daten in der Überlaufspalte mithilfe der XMLTEXT Direktive in einer SELECT Anweisung mithilfe des EXPLICIT-Modus adressiert werden.

Betrachten Sie die Person Tabelle. Diese Tabelle enthält eine Overflow Spalte, in dem der unverbrauchte Teil des XML-Dokuments gespeichert wird.

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>');  

Diese Abfrage ruft Spalten aus der Person Tabelle ab. Für die Overflow-Spalte wird „AttributeName“ nicht angegeben, aber die Direktive wird auf XMLTEXT gesetzt, um einen universellen Tabellenspaltennamen bereitzustellen.

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;  

Im resultierenden XML-Dokument:

  • Da "AttributeName" für die Overflow Spalte nicht angegeben ist und die xmltext Direktive angegeben wird, werden die Attribute im <overflow> Element an die Attributliste des eingeschlossenen <Parent> Elements angefügt.

  • Da das PersonIDAttribut im <xmltext> Element mit dem Attribut in Konflikt steht, das PersonID auf derselben Elementebene abgerufen wurde, wird das Attribut imxmltext<> Element ignoriert, auch wenn PersonID NULL ist. Im Allgemeinen überschreibt ein Attribut ein Attribut mit demselben Namen im Überlauf.

Dies ist das Ergebnis:

<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>

Wenn die Überlaufdaten Unterelemente aufweisen und dieselbe Abfrage angegeben wird, werden die Unterelemente in der Overflow Spalte als Unterelemente des eingeschlossenen <Parent> Elements hinzugefügt.

Ändern Sie beispielsweise die Daten in der Person Tabelle so, dass die Overflow Spalte jetzt Unterelemente enthält.

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>');  

Wenn dieselbe Abfrage ausgeführt wird, werden die Unterelemente im <xmltext> Element als Unterelemente des eingeschlossenen <Parent> Elements hinzugefügt:

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;  

Dies ist das Ergebnis:

<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>

Wenn AttributName mit der xmltext Direktive angegeben wird, werden die Attribute des <overflow> Elements als Attribute der Unterelemente des eingeschlossenen <Parent> Elements hinzugefügt. Der für AttributName angegebene Name wird zum Namen des Unterelements.

In dieser Abfrage wird "AttributeName" <overflow>zusammen mit der xmltext Direktive angegeben:

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  

Dies ist das Ergebnis:

<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>

In diesem Abfrageelement wird die Direktive für das PersonName Attribut angegeben. Infolgedessen wird PersonName als Unterelement des umschließenden <Parent>-Elements hinzugefügt. Die Attribute des Elements <xmltext> werden weiterhin an das eingeschlossene <Parent> Element angefügt. Der Inhalt des <overflow> Elements, Unterelemente, wird den anderen Unterelementen der eingeschlossenen <Parent> Elemente vorangestellt.

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;  

Dies ist das Ergebnis:

<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>

Wenn die XMLTEXT Spaltendaten Attribute für das Stammelement enthalten, werden diese Attribute nicht im XML-Datenschema angezeigt, und der MSXML-Parser überprüft nicht das resultierende XML-Dokumentfragment. Beispiel:

SELECT 1 AS Tag,  
       0 ASParent,  
       N'<overflow a="1"/>' AS 'overflow!1!!xmltext'  
FOR XML EXPLICIT, xmldata;  

Dies ist das Ergebnis. Beachten Sie, dass im zurückgegebenen Schema das Overflow-Attribut a im Schema fehlt:

<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>

Siehe auch

Verwenden des EXPLIZITEN Modus mit FOR XML