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 BusinessEntityIDkolom , , FirstNamedan 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