Contoh: Tentukan direktif XMLTEXT

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Contoh ini menggambarkan bagaimana data dalam kolom overflow ditangani dengan menggunakan direktif XMLTEXT dalam pernyataan yang menggunakan mode EXPLICIT.

Perhatikan tabel Person. Tabel ini memiliki Overflow kolom yang menyimpan bagian dokumen XML yang tidak dikonsumsi.

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

Kueri ini mengambil kolom dari Person tabel. Overflow Untuk kolom, AttributeName tidak ditentukan, tetapi direktif diatur ke XMLTEXT sebagai bagian dari penyediaan nama kolom tabel universal.

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;

Dalam dokumen XML yang dihasilkan:

  • Karena AttributeName tidak ditentukan untuk kolom Overflow dan direktif xmltext ditentukan, atribut dalam elemen <overflow> ditambahkan ke daftar atribut elemen <Parent> yang mengapitnya.

  • Karena atribut dalam elemen PersonID bertentangan dengan atribut yang diambil pada tingkat elemen <xmltext> yang sama, atribut dalam elemen PersonID diabaikan, bahkan jika <xmltext> adalah NULL. Secara umum, sebuah atribut menimpa atribut lain dengan nama yang sama di overflow.

Ini adalah hasilnya:

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

Jika data overflow memiliki subelemen dan kueri yang sama ditentukan, subelemen dalam kolom Overflow ditambahkan sebagai subelemen dari elemen <Parent> induk.

Misalnya, ubah data dalam Person tabel sehingga Overflow kolom sekarang memiliki subelemen.

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

Jika kueri yang sama dijalankan, subelemen dalam <xmltext> elemen ditambahkan sebagai subelemen elemen <Parent> penutup:

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;

Ini adalah hasilnya:

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

Jika AttributeName ditentukan dengan direktif xmltext, atribut elemen <overflow> ditambahkan sebagai atribut ke subelemen dari elemen <Parent> induk. Nama yang ditentukan untuk AttributeName menjadi nama subelemen

Dalam kueri ini, AttributeName, <overflow>, ditentukan bersama dengan direktif 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;

Ini adalah hasilnya:

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

Dalam elemen kueri ini, direktif ditentukan untuk PersonName atribut. Ini menghasilkan PersonName ditambahkan sebagai subelemen dari elemen penutup <Parent> . Atribut <xmltext> masih ditambahkan ke elemen penutup <Parent> . Isi elemen <overflow>, yaitu subelemen, ditempatkan di depan subelemen lain dari elemen <Parent> yang melingkupinya.

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;

Ini adalah hasilnya:

<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 Jika data kolom berisi atribut pada elemen akar, atribut ini tidak ditampilkan dalam skema data XML dan pengurai MSXML tidak memvalidasi fragmen dokumen XML yang dihasilkan. Contohnya:

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

Ini adalah hasilnya. Dalam skema yang dikembalikan, atribut overflow a tidak ada dalam skema:

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