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 direktifxmltext
ditentukan, atribut dalam<overflow>
elemen ditambahkan ke daftar<Parent>
atribut elemen penutup.PersonID
Karena atribut dalam<xmltext>
elemen bertentangan dengan atribut yangPersonID
diambil pada tingkat elemen yang sama, atribut dalam<xmltext>
elemen diabaikan, bahkan jikaPersonID
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>