Panduan untuk Menggunakan Metode Tipe Data xml

Berlaku untuk:SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Topik ini menjelaskan panduan untuk menggunakan metode jenis data xml .

Pernyataan PRINT

Metode tipe data xml tidak dapat digunakan dalam pernyataan PRINT seperti yang diperlihatkan dalam contoh berikut. Metode tipe data xml diperlakukan sebagai subkueri, dan subkueri tidak diperbolehkan dalam pernyataan PRINT. Akibatnya, contoh berikut mengembalikan kesalahan:

DECLARE @x XML
SET @x = '<root>Hello</root>'
PRINT @x.value('/root[1]', 'varchar(20)') -- will not work because this is treated as a subquery (select top 1 col from table)

Solusinya adalah terlebih dahulu menetapkan hasil metode value() ke variabel jenis xml lalu menentukan variabel dalam kueri.

DECLARE @x XML
DECLARE @c VARCHAR(max)
SET @x = '<root>Hello</root>'
SET @c = @x.value('/root[1]', 'VARCHAR(11)')
PRINT @c

Klausul GROUP BY

Metode jenis data xml diperlakukan secara internal sebagai subkueri. Karena GROUP BY memerlukan skalar dan tidak memperbolehkan agregat dan subkueri, Anda tidak dapat menentukan metode tipe data xml dalam klausul GROUP BY. Solusinya adalah memanggil fungsi yang ditentukan pengguna yang menggunakan metode XML di dalamnya.

Kesalahan Pelaporan

Saat melaporkan kesalahan, metode jenis data xml memunculkan satu kesalahan dalam format berikut:

Msg errorNumber, Level levelNumber, State stateNumber:
XQuery [database.table.method]: description_of_error

Contohnya:

Msg 2396, Level 16, State 1:
XQuery [xmldb_test.xmlcol.query()]: Attribute may not appear outside of an element

Pemeriksaan Singleton

Langkah-langkah lokasi, parameter fungsi, dan operator yang memerlukan singleton akan mengembalikan kesalahan jika pengkompilasi tidak dapat menentukan apakah singleton dijamin pada durasi. Masalah ini sering terjadi pada data yang tidak dititik. Misalnya, pencarian atribut memerlukan elemen induk singleton. Ordinal yang memilih satu simpul induk sudah cukup. Evaluasi kombinasi node()-value() untuk mengekstrak nilai atribut mungkin tidak memerlukan spesifikasi ordinal. Ini ditunjukkan dalam contoh berikutnya.

Contoh: Singleton yang Diketahui

Dalam contoh ini, metode node() menghasilkan baris terpisah untuk setiap <book> elemen. Metode value() yang dievaluasi pada node <book> mengekstrak nilai @genre dan, menjadi atribut, adalah singleton.

SELECT nref.value('@genre', 'VARCHAR(max)') LastName
FROM T CROSS APPLY xCol.nodes('//book') AS R(nref)

Skema XML digunakan untuk pemeriksaan tipe XML yang diketik. Jika simpul ditentukan sebagai database tunggal dalam skema XML, pengkompilasi menggunakan informasi tersebut dan tidak ada kesalahan yang terjadi. Jika tidak, ordinal yang memilih satu simpul diperlukan. Secara khusus, penggunaan sumbu descendant-or-self sumbu (//), seperti di /book//title, kehilangan inferensi kardinalitas singleton untuk <title> elemen, bahkan jika skema XML menentukannya menjadi demikian. Oleh karena itu, Anda harus menulis ulang sebagai (/book//title)[1].

Penting untuk tetap mengetahui perbedaan antara //first-name[1] dan (//first-name)[1] untuk pemeriksaan jenis. Yang pertama mengembalikan urutan <first-name> simpul di mana setiap simpul adalah simpul paling <first-name> kiri di antara saudara-saudaranya. Yang terakhir mengembalikan simpul singleton <first-name> pertama dalam urutan dokumen dalam instans XML.

Contoh: Menggunakan value()

Kueri berikut pada kolom XML yang tidak dititik menghasilkan kesalahan kompilasi statis. Ini karena value() mengharapkan node singleton sebagai argumen pertama dan pengkompilasi tidak dapat menentukan apakah hanya satu <last-name> simpul yang akan terjadi pada durasi:

SELECT xCol.value('//author/last-name', 'NVARCHAR(50)') LastName
FROM T

Berikut ini adalah solusi yang dapat Anda pertimbangkan:

SELECT xCol.value('//author/last-name[1]', 'NVARCHAR(50)') LastName
FROM T

Namun, solusi ini tidak menyelesaikan kesalahan, karena beberapa <author> simpul dapat terjadi di setiap instans XML. Penulisan ulang berikut berfungsi:

SELECT xCol.value('(//author/last-name/text())[1]', 'NVARCHAR(50)') LastName
FROM T

Kueri ini mengembalikan nilai elemen pertama <last-name> di setiap instans XML.

Lihat juga