Bagikan melalui


Contoh: Tentukan direktif XMLTEXT

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Contoh ini menggambarkan bagaimana data dalam kolom luapan ditangani dengan menggunakan direktif XMLTEXT dalam SELECT pernyataan menggunakan mode EKSPLISIT.

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.

  • PersonIDKarena atribut dalam <xmltext> elemen bertentangan dengan atribut yang PersonID diambil pada tingkat elemen yang sama, atribut dalam <xmltext> elemen diabaikan, bahkan jika PersonID 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