Untuk dukungan XML untuk jenis data xml
Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
Jika kueri FOR XML menentukan kolom jenis xml dalam klausa SELECT, nilai kolom dipetakan sebagai elemen dalam XML yang dikembalikan, terlepas dari apakah Anda menentukan arahan ELEMENTS. Deklarasi XML apa pun di kolom jenis xml tidak diserialisasikan.
Misalnya, kueri berikut mengambil informasi kontak pelanggan seperti BusinessEntityID
kolom , , FirstName
dan LastName
, dan nomor telepon dari AdditionalContactInfo
kolom jenis xml .
USE AdventureWorks2022;
GO
SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumber
FROM Person.Person
WHERE AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
')IS NOT NULL
FOR XML AUTO, TYPE;
Karena kueri tidak menentukan arahan ELEMENTS, nilai kolom dikembalikan sebagai atribut, kecuali untuk nilai informasi kontak tambahan yang diambil dari kolom jenis xml . Ini dikembalikan sebagai elemen.
Ini adalah hasil parsial:
<Person.Person BusinessEntityID="291" FirstName="Gustavo" LastName="Achong">
<PhoneNumber>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1112</act:number>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1111</act:number>
</PhoneNumber>
</Person.Person>
<Person.Person BusinessEntityID="293" FirstName="Catherine" LastName="Abel">
<PhoneNumber>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-2222</act:number>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-1234</act:number>
</PhoneNumber>
</Person.Person>
...
Jika Anda menentukan alias kolom untuk kolom XML yang dihasilkan oleh XQuery, alias tersebut digunakan untuk menambahkan elemen pembungkus di sekitar XML yang dihasilkan oleh XQuery. Misalnya, kueri berikut menentukan MorePhoneNumbers
sebagai alias kolom:
SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumber
FROM Person.Person
WHERE AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') IS NOT NULL
FOR XML AUTO, TYPE;
XML yang dikembalikan oleh XQuery dibungkus dalam <MorePhoneNumbers>
elemen , seperti yang diperlihatkan dalam hasil parsial berikut:
<Person.Person BusinessEntityID="291" FirstName="Gustavo" LastName="Achong">
<MorePhoneNumbers>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1112</act:number>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1111</act:number>
</MorePhoneNumbers>
</Person.Person>
<Person.Person BusinessEntityID="293" FirstName="Catherine" LastName="Abel">
<MorePhoneNumbers>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-2222</act:number>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-1234</act:number>
</MorePhoneNumbers>
</Person.Person>
...
Jika Anda menentukan arahan ELEMENTS dalam kueri, BusinessEntityID, LastName, dan FirstName akan dikembalikan sebagai elemen dalam XML yang dihasilkan.
Contoh berikut mengilustrasikan bahwa logika pemrosesan FOR XML tidak membuat serialisasi deklarasi XML apa pun dalam data XML dari kolom jenis xml :
CREATE TABLE t(i int, x xml)
GO
INSERT INTO t VALUES(1, '<?xml version="1.0" encoding="UTF-8" ?>
<Root SomeID="10" />')
SELECT i, x
FROM t
FOR XML AUTO;
Ini adalah hasilnya. Dalam hasilnya, deklarasi <?xml version="1.0" encoding="UTF-8" ?>
XML tidak diserialisasikan.
<root>
<t i="1">
<x>
<Root SomeID="10" />
</x>
</t>
</root>
Mengembalikan XML dari fungsi yang ditentukan pengguna
Untuk kueri XML dapat digunakan untuk mengembalikan XML dari fungsi yang ditentukan pengguna yang mengembalikan salah satu hal berikut ini:
Tabel dengan kolom tipe xml tunggal
Instans jenis xml
Misalnya, fungsi yang ditentukan pengguna berikut mengembalikan tabel dengan satu kolom jenis xml:
USE AdventureWorks2022;
GO
CREATE FUNCTION dbo.MyUDF (@ProudctModelID int)
RETURNS @T TABLE
(
ProductDescription xml
)
AS
BEGIN
INSERT @T
SELECT CatalogDescription.query('
declare namespace PD="https://www.adventure-works.com/schemas/products/description";
//PD:ProductDescription ')
FROM Production.ProductModel
WHERE ProductModelID = @ProudctModelID
RETURN
END;
Anda dapat menjalankan fungsi yang ditentukan pengguna dan mengkueri tabel yang dikembalikan olehnya. Dalam contoh ini, XML yang dikembalikan dengan mengkueri tabel ditetapkan ke variabel jenis xml .
DECLARE @x xml;
SET @x = (SELECT * FROM MyUDF(19));
SELECT @x;
Ini adalah contoh lain dari fungsi yang ditentukan pengguna. Fungsi yang ditentukan pengguna ini mengembalikan instans jenis xml . Dalam contoh ini, fungsi yang ditentukan pengguna mengembalikan instans XML yang diketik, karena namespace layanan skema ditentukan.
DROP FUNCTION dbo.MyUDF;
GO
CREATE FUNCTION MyUDF (@ProductModelID int)
RETURNS xml ([Production].[ProductDescriptionSchemaCollection])
AS
BEGIN
DECLARE @x xml
SET @x = ( SELECT CatalogDescription
FROM Production.ProductModel
WHERE ProductModelID = @ProductModelID )
RETURN @x
END;
XML yang dikembalikan oleh fungsi yang ditentukan pengguna dapat ditetapkan ke variabel jenis xml sebagai berikut:
DECLARE @x xml;
SELECT @x= dbo.MyUDF (19) ;
SELECT @x;
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk