Bagikan melalui


Penanganan kesalahan (XQuery)

Berlaku untuk:SQL Server

Spesifikasi W3C memungkinkan kesalahan jenis dinaikkan secara statis atau dinamis, dan menentukan kesalahan statis, dinamis, dan jenis.

Kompilasi dan penanganan kesalahan

Kesalahan kompilasi dikembalikan dari ekspresi dan XML DML pernyataan Xquery yang salah secara sintetis. Fase kompilasi memeriksa kebenaran jenis statis ekspresi XQuery dan pernyataan DML, dan menggunakan skema XML untuk inferensi jenis untuk XML yang diketik. Ini menimbulkan kesalahan jenis statis jika ekspresi dapat gagal pada waktu proses karena pelanggaran keamanan jenis. Contoh kesalahan statis adalah penambahan string ke bilangan bulat dan kueri untuk simpul yang tidak ada untuk data yang diekstrak.

Sebagai penyimpangan dari standar W3C, kesalahan run-time XQuery dikonversi menjadi urutan kosong. Urutan ini mungkin disebarluaskan sebagai XML kosong atau NULL ke hasil kueri, tergantung pada konteks pemanggilan.

Transmisi eksplisit ke jenis yang benar memungkinkan pengguna untuk mengatasi kesalahan statis, meskipun kesalahan cast run-time akan diubah menjadi urutan kosong.

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.

Kesalahan statis

Kesalahan statis dikembalikan dengan menggunakan mekanisme kesalahan Transact-SQL. Di SQL Server, kesalahan jenis XQuery dikembalikan secara statis. Untuk informasi selengkapnya, lihat XQuery dan Pengetikan Statis.

Kesalahan dinamis

Di XQuery, sebagian besar kesalahan dinamis dipetakan ke urutan kosong ("()"). Namun, ini adalah dua pengecualian: Kondisi luapan dalam fungsi agregator XQuery dan kesalahan validasi XML-DML. Sebagian besar kesalahan dinamis dipetakan ke urutan kosong. Jika tidak, eksekusi kueri yang memanfaatkan indeks XML mungkin menimbulkan kesalahan tak terduga. Oleh karena itu, untuk memberikan eksekusi yang efisien tanpa menghasilkan kesalahan tak terduga, Mesin Database SQL Server memetakan kesalahan dinamis ke ().

Sering kali, dalam situasi di mana kesalahan dinamis akan terjadi di dalam predikat, tidak meningkatkan kesalahan tidak mengubah semantik, karena () dipetakan ke False. Namun, dalam beberapa kasus, mengembalikan () alih-alih kesalahan dinamis dapat menyebabkan hasil yang tidak terduga. Berikut ini adalah contoh yang mengilustrasikan ini.

Contoh: Menggunakan fungsi avg() dengan string

Dalam contoh berikut, fungsi Rata-rata dipanggil untuk menghitung rata-rata dari tiga nilai. Salah satu nilai ini adalah string. Karena instans XML dalam kasus ini tidak diketik, semua data di dalamnya adalah jenis atom yang tidak diketik. Fungsi avg() terlebih dahulu melemparkan nilai-nilai ini ke xs:double sebelum menghitung rata-rata. Namun, nilainya, "Hello", tidak dapat dilemparkan ke xs:double dan membuat kesalahan dinamis. Dalam hal ini, alih-alih mengembalikan kesalahan dinamis, transmisi "Hello" ke xs:double menyebabkan urutan kosong. Fungsi avg() mengabaikan nilai ini, menghitung rata-rata dua nilai lainnya, dan mengembalikan 150.

DECLARE @x xml
SET @x=N'<root xmlns:myNS="test">
 <a>100</a>
 <b>200</b>
 <c>Hello</c>
</root>'
SELECT @x.query('avg(//*)')

Contoh: Menggunakan fungsi not

Saat Anda menggunakan fungsi Not dalam predikat, misalnya, /SomeNode[not(Expression)], dan ekspresi menyebabkan kesalahan dinamis, urutan kosong akan dikembalikan alih-alih kesalahan. Menerapkan not() ke urutan kosong mengembalikan True, bukan kesalahan.

Contoh: Mentransmisian untai (karakter)

Dalam contoh berikut, untai (karakter) literal "NaN" dilemparkan ke xs:string, lalu ke xs:double. Hasilnya adalah set baris kosong. Meskipun string "NaN" tidak berhasil ditransmisikan ke xs:double, ini tidak dapat ditentukan sampai runtime karena string pertama kali ditransmisikan ke xs:string.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO

Namun, dalam contoh ini, kesalahan jenis statis terjadi.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO

Batasan implementasi

Fungsi fn:error() tidak didukung.