Megosztás a következőn keresztül:


Példa: Az XMLTEXT-direktíva megadása

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Ez a példa bemutatja, hogyan történik a túlcsordulási oszlop adatainak kezelése az XMLTEXT-direktívaSELECT explicit módban történő használatával.

Tekintse meg a Person táblázatot. Ez a táblázat egy Overflow oszlopot tartalmaz, amely az XML-dokumentum fel nem használt részét tárolja.

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

Ez a lekérdezés lekéri az oszlopokat a Person táblából. Az oszlop esetében az OverflowAttribútumnév nincs megadva, de az irányelv beállítva van XMLTEXT mint univerzális táblaoszlop név megadása részeként.

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;

Az eredményként kapott XML-dokumentumban:

  • Mivel az Attribútumnév nincs megadva az Overflow oszlophoz, és az xmltext irányelv meg van adva, az <overflow> elem attribútumai hozzá lesznek fűzve a belefoglaló <Parent> elem attribútumlistájához.

  • Mivel az PersonID<xmltext> elem attribútuma ütközik az PersonID ugyanazon elemszinten lekért attribútummal, a rendszer figyelmen kívül hagyja az <xmltext> elem attribútumát, még akkor is, ha PersonID NULL értékű. Az attribútumok általában felülbírálnak egy azonos nevű attribútumot a túlcsordulásban.

Ez az eredmény:

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

Ha a túlcsordulási adatok alelemeket tartalmaznak, és ugyanaz a lekérdezés van megadva, az Overflow oszlopban lévő alelemek a <Parent> elemet körülvevő elemek alelemeiként lesznek hozzáadva.

Módosítsa például a táblázat adatait Person úgy, hogy az Overflow oszlop alelemeket tartalmazzon.

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

Ha ugyanazt a lekérdezést hajtja végre, a <xmltext> elemen belüli alelemek hozzáadódnak a környező <Parent> elem alelemeiként.

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;

Ez az eredmény:

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

Ha az attribútumnév meg van adva az xmltext irányelvvel, az <overflow> elem attribútumai a belefoglaló elem alelemeinek attribútumaiként lesznek hozzáadva <Parent> . Az Attribútumnévhez megadott név lesz az al-elemek neve

Ebben a lekérdezésben az Attribútumnév, <overflow>az irányelvvel xmltext együtt van megadva*:*

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;

Ez az eredmény:

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

Ebben a lekérdezési elemben az irányelv van megadva a PersonName attribútum számára. Ennek eredményeként a PersonName elemet az azt körülvevő <Parent> elem alelemeként adják hozzá. Az attribútumok a <xmltext> továbbra is hozzá vannak fűzve a belefoglaló <Parent> elemhez. A <overflow> elem tartalma és alelemei előre hozzáadódnak a befoglaló <Parent> elemek többi aleleméhez.

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;

Ez az eredmény:

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

Ha az XMLTEXT oszlopadatok attribútumokat tartalmaznak a gyökérelemen, ezek az attribútumok nem jelennek meg az XML-adatsémában, és az MSXML-elemző nem ellenőrzi az eredményként kapott XML-dokumentumrészletet. Például:

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

Ez az eredmény. A visszaadott sémában a túlcsordulás attribútum a hiányzik a sémából:

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

Lásd még