Bagikan melalui


Contoh: Menentukan Direktif XMLTEXT

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

Pertimbangkan 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!!XMLTEST] -- 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 dari elemen penutup <Parent>.

  • PersonIDKarena atribut dalam <xmltext> elemen bertentangan dengan atribut yang PersonID diambil pada tingkat elemen yang sama, atribut dalamxmltext<> 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 kelebihan memiliki subelemen dan ditentukan kueri yang sama, subelemen dalam kolom Overflow ditambahkan sebagai subelemen dari elemen yang melingkupinya <Parent>.

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 penutupParent<>. 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 ASParent,  
       N'<overflow a="1"/>' AS 'overflow!1!!xmltext'  
FOR XML EXPLICIT, xmldata;  

Ini adalah hasilnya. Perhatikan bahwa pada 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>

Lihat Juga

Gunakan Mode EKSPLISIT dengan FOR XML