Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Database SQL di Microsoft Fabric
Artikel ini menjelaskan panduan untuk menggunakan metode jenis data xml .
Pernyataan PRINT
Metode tipe data xml tidak dapat digunakan dalam pernyataan seperti yang PRINT diperlihatkan dalam contoh berikut. Metode tipe data xml diperlakukan sebagai subkueri, dan subkueri tidak diizinkan dalam PRINT pernyataan. 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
Klausa GROUP BY
Metode jenis data xml diperlakukan secara internal sebagai subkueri. Karena GROUP BY memerlukan skalar dan tidak mengizinkan agregat dan subkueri, Anda tidak dapat menentukan metode jenis data xml dalam GROUP BY klausa. Solusinya adalah memanggil fungsi yang ditentukan pengguna yang menggunakan metode XML di dalamnya.
Melaporkan Kesalahan
Saat melaporkan kesalahan, metode jenis data xml menimbulkan 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
Nota
Kesalahan penguraian yang dimunculkan oleh pengurai XQuery (seperti kesalahan sintaks dalam XML yang direferensikan sebagai bagian dari metode jenis data XML, misalnya), membatalkan transaksi aktif, terlepas dari pengaturan XACT_ABORT sesi saat ini.
Pemeriksaan singleton
Langkah-langkah lokasi, parameter fungsi, dan operator yang memerlukan singleton akan mengembalikan kesalahan jika pengkompilasi tidak dapat menentukan apakah singleton dijamin pada waktu proses. Masalah ini sering terjadi dengan 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 singleton 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 turunan atau sendiri (//), seperti dalam /book//title, kehilangan inferensi kardinalitas tunggal untuk <title> elemen, bahkan jika skema XML menentukannya. 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 node 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 waktu proses:
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 mungkin 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.