Bagikan melalui


Contoh: Tentukan direktif XMLTEXT

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

Contoh ini menggambarkan bagaimana data dalam kolom luapan ditangani dengan menggunakan .

Person Pertimbangkan tabel. 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 Overflow kolom dan direktif xmltext ditentukan, atribut dalam <overflow> elemen ditambahkan ke daftar <Parent> atribut elemen penutup.

  • 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. Umumnya, atribut mengambil alih atribut dengan nama yang sama dalam luapan.

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 luapan memiliki subelemen dan kueri yang sama ditentukan, subelemen dalam Overflow kolom ditambahkan sebagai subelemen <Parent> elemen penutup.

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 xmltext direktif, atribut <overflow> elemen ditambahkan sebagai atribut subelemen elemen <Parent> penutup. 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> . Konten <overflow> elemen, subelemen, didahului ke subelemen lain dari <Parent> elemen penutup.

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 a luapan hilang dari 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>

Lihat juga