Delen via


Voorbeeld: De XMLTEXT-instructie opgeven

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

In dit voorbeeld ziet u hoe gegevens in de overloopkolom worden behandeld met behulp van de XMLTEXT-instructie in een SELECT-verklaring in modus EXPLICIET.

Houd rekening met de Person tabel. Deze tabel bevat een Overflow kolom waarin het niet-verwerkte deel van het XML-document wordt opgeslagen.

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

Met deze query worden kolommen opgehaald uit de Person tabel. Voor de Overflow kolom is AttributeName niet opgegeven, maar directive wordt ingesteld op XMLTEXT wordt gebruikt als onderdeel van het aangeven van een universele tabelkolomnaam.

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;

In het resulterende XML-document:

  • Omdat AttributeName niet is opgegeven voor de Overflow kolom en de xmltext instructie is opgegeven, worden de kenmerken in het <overflow> element toegevoegd aan de kenmerkenlijst van het omsluitelement <Parent> .

  • Omdat het PersonID kenmerk in het <xmltext> element conflicteert met het PersonID kenmerk dat op hetzelfde elementniveau is opgehaald, wordt het kenmerk in het <xmltext> element genegeerd, zelfs als PersonID het NULL is. Over het algemeen overschrijft een kenmerk een ander kenmerk met dezelfde naam in het overvloeigebied.

Dit is het resultaat:

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

Als de overloopgegevens subelementen bevatten en dezelfde query wordt opgegeven, worden de subelementen in de Overflow kolom toegevoegd als de subelementen van het omsluitelement <Parent> .

Wijzig bijvoorbeeld de gegevens in de Person tabel zodat de Overflow kolom nu subelementen bevat.

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

Als dezelfde query wordt uitgevoerd, worden de subelementen in het <xmltext> element toegevoegd als subelementen van het omsluitelement <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;

Dit is het resultaat:

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

Als AttributeName is opgegeven met de xmltext instructie, worden de kenmerken van het <overflow> element toegevoegd als kenmerken van de subelementen van het omsluitelement <Parent> . De naam die is opgegeven voor AttributeName , wordt de naam van het subelement

In deze query wordt AttributeName, samen met de <overflow>xmltext instructie*:*, gespecificeerd.

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;

Dit is het resultaat:

<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 dit query-element wordt een instructie opgegeven voor PersonName het kenmerk. Dit resulteert in dat PersonName als subelement wordt toegevoegd aan het omsluitende element <Parent>. De kenmerken van de elementen <xmltext> worden nog steeds toegevoegd aan het insluitelement <Parent> . De inhoud van het <overflow>-element, met subelementen, wordt toegevoegd aan het begin van de andere subelementen van de omringende <Parent>-elementen.

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;

Dit is het resultaat:

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

Als de XMLTEXT kolomgegevens kenmerken van het hoofdelement bevatten, worden deze kenmerken niet weergegeven in het XML-gegevensschema en valideert de MSXML-parser het resulterende XML-documentfragment niet. Voorbeeld:

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

Dit is het resultaat. In het geretourneerde schema ontbreekt het overloopkenmerk a in het schema:

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

Zie ook