Bagikan melalui


Menggunakan kueri FOR XML bersarang

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Jenis data xml dan direktif TYPE dalam kueri FOR XML memungkinkan XML yang dikembalikan oleh kueri FOR XML untuk diproses baik di server maupun di klien.

Pemrosesan dengan variabel jenis xml

Anda dapat menetapkan hasil kueri FOR XML ke variabel jenis xml , atau menggunakan XQuery untuk mengkueri hasilnya, dan menetapkan hasil tersebut ke variabel jenis xml untuk pemrosesan lebih lanjut.

DECLARE @x xml
SET @x=(SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID=122 or ProductModelID=119
        FOR XML RAW, TYPE)
SELECT @x
-- Result
--<row ProductModelID="122" Name="All-Purpose Bike Stand" />
--<row ProductModelID="119" Name="Bike Wash" />

Anda juga dapat memproses XML yang dikembalikan dalam variabel, @x, dengan menggunakan salah satu metode jenis data xml . Misalnya, Anda dapat mengambil nilai atribut ProductModelID dengan menggunakan metode value().

DECLARE @i int;
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));
SELECT @i;

Dalam contoh berikut, hasil kueri FOR XML dikembalikan sebagai tipe xml karena arahan TYPE ditentukan dalam klausa FOR XML.

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=119 or ProductModelID=122
FOR XML RAW, TYPE,ROOT('myRoot');

Ini adalah hasilnya:

<myRoot>
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />
  <row ProductModelID="119" Name="Bike Wash" />
</myRoot>

Karena hasilnya adalah jenis xml , Anda dapat menentukan salah satu metode tipe data xml secara langsung terhadap XML ini, seperti yang diperlihatkan dalam kueri berikut. Dalam kueri, metode query() (Tipe Data xml) digunakan untuk mengambil elemen turunan pertama <row> dari elemen <myRoot>.

SELECT  (SELECT ProductModelID, Name
         FROM Production.ProductModel
         WHERE ProductModelID=119 or ProductModelID=122
         FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');

Ini adalah hasilnya:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

Mengembalikan hasil kueri FOR XML bagian dalam ke kueri luar sebagai instans jenis XML.

Anda dapat menulis kueri berlapis FOR XML di mana hasil kueri dalam dikembalikan sebagai jenis xml ke kueri luar. Contohnya:

SELECT Col1,
       Col2,
       ( SELECT Col3, Col4
        FROM  T2
        WHERE T2.Col = T1.Col
        ...
        FOR XML AUTO, TYPE )
FROM T1
WHERE ...
FOR XML AUTO, TYPE;

Perhatikan hal berikut ini dari kueri sebelumnya:

  • XML yang dihasilkan oleh kueri dalam FOR XML ditambahkan ke XML yang dihasilkan oleh kueri luar FOR XML.

  • Kueri dalam menentukan arahan TYPE . Oleh karena itu, data XML yang dikembalikan oleh kueri internal adalah bertipe xml. Jika direktif TYPE tidak ditentukan, hasil kueri dalam FOR XML dikembalikan sebagai nvarchar(max) dan data XML diubah menjadi entitas.

Mengontrol bentuk data XML yang dihasilkan

Kueri FOR XML bertingkat memberi Anda lebih banyak kendali dalam menentukan bentuk data XML yang dihasilkan. Anda dapat menggunakan kueri FOR XML berlapis untuk membuat XML yang sebagian berfokus pada atribut dan sebagian berfokus pada elemen.

Untuk informasi selengkapnya tentang menentukan XML yang berfokus pada atribut dan berfokus pada elemen dengan kueri FOR XML bersarang, lihat Kueri FOR XML Dibandingkan dengan Kueri FOR XML Bersarang dan Membentuk XML dengan Kueri FOR XML Bersarang.

Anda dapat membuat hierarki XML yang menyertakan saudara kandung dengan menentukan mode OTOMATIS berlapis untuk kueri XML. Untuk informasi selengkapnya, lihat Membuat Saudara dengan Kueri Mode OTOMATIS Berlapis.

Terlepas dari mode mana yang Anda gunakan, kueri XML berlapis memberikan kontrol lebih besar dalam menjelaskan bentuk XML yang dihasilkan. Mereka dapat digunakan sebagai pengganti kueri mode EKSPLISIT.

Contoh

Topik berikut ini menyediakan contoh kueri FOR XML bersarang.