Freigeben über


Beispiel: Angeben der XMLTEXT-Direktive

Dieses Beispiel veranschaulicht, wie Daten in der Überlaufspalte mithilfe der XMLTEXT-Direktive in einer SELECT-Anweisung im EXPLICIT-Modus verarbeitet werden.

Sie sehen hier die Person-Tabelle. In dieser Tabelle speichert die Overflow-Spalte den unverbrauchten Teil des XML-Dokuments.

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. AttributeName ist für die Overflow-Spalte nicht angegeben, directive ist jedoch auf den Wert XMLTEXT festgelegt, um einen Spaltennamen für die Universaltabelle 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 für die Overflow-Spalte kein AttributeName, sondern die xmltext-Direktive angegeben ist, werden die Attribute des <overflow>-Elements an die Attributliste des einschließenden <Parent>-Elements angehängt.

  • Da das PersonID-Attribut des <xmltext>-Elements in Konflikt zu dem auf derselben Elementebene abgerufenen PersonID-Attribut steht, wird das Attribut des <xmltext>-Elements ignoriert, sogar wenn PersonID NULL ist. Im Allgemeinen setzt ein Attribut ein Attribut mit demselben Namen in der Überlaufspalte außer Kraft.

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>

Wird dieselbe Abfrage angegeben, und die Überlaufdaten besitzen Unterelemente, werden die Unterelemente in der Overflow-Spalte als Unterelemente des einschließenden <Parent>-Elements hinzugefügt.

So werden in diesem Beispiel die Daten in der Person-Tabelle so geändert, dass die Overflow-Spalte nun Unterelemente besitzt:

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

Beim Ausführen derselben Abfrage werden die Unterelemente des <xmltext>-Elements als Unterelemente des einschließenden 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>

Wird AttributeName mit der xmltext-Direktive angegeben, werden die Attribute des <overflow>-Elements als Attribute der Unterelemente des einschließenden <Parent>-Elements hinzugefügt. Der für AttributeName 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 directive für das PersonName-Attribut angegeben. Dadurch wird PersonName als Unterelement des einschließenden <Parent>-Elements hinzugefügt. Die Attribute von <xmltext> werden auch hier an das einschließende <Parent>-Element angefügt. Der Inhalt des <overflow>-Elements (Unterelemente usw.) wird den anderen Unterelementen der einschließenden 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 Daten der XMLTEXT-Spalte Attribute für das Stammelement enthalten, werden diese Attribute nicht im XML-Datenschema angezeigt, und der MSXML-Parser führt keine Überprüfung des resultierenden XML-Dokumentfragments aus. 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 das overflow-Attribut a im zurückgegebenen 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

Verweis