Dari dokumentasi RAISERROR (penekanan saya):
Tingkat keparahan dari 0 hingga 18 dapat ditentukan oleh pengguna mana pun. Tingkat keparahan dari 19 hingga 25 hanya dapat ditentukan oleh anggota peran server tetap sysadmin atau pengguna dengan izin ALTER TRACE. Untuk tingkat keparahan dari 19 hingga 25, opsi DENGAN LOG diperlukan.
Kemungkinan besar kepala sekolah Anda menjalankan skrip karena tidak memenuhi kriteria ini.
Tidak ada yang salah dengan menggunakan RAISERROR
; Anda hanya menggunakan tingkat keparahan yang berlebihan. Saya menggunakan level 16 sebagai default untuk kesalahan yang muncul dan urutannya akan diakhiri. Jika Anda ingin lebih akurat, Anda dapat mengikuti level yang diberikan oleh Microsoft sendiri:
Sekarang, setelah mengatakan semua itu, tergantung pada konteks skripnya, gunakan RAISERROR
mungkin tidak cukup, karena tidak "keluar" dari skrip dengan sendirinya (menggunakan tingkat keparahan normal).
Sebagai contoh:
RAISERROR(N'Test', 16, 1);
SELECT 1; /* Executed! */
Ini akan baik meningkatkan kesalahan dan mengembalikan hasil set.
Untuk segera menghentikan skrip, saya lebih suka menggunakan RETURN
(menggunakan GOTO
konstruksi -type umumnya tidak disarankan di sebagian besar lingkaran pemrograman di mana alternatif ada):
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
Atau atasi penggunaan kesalahan TRY/CATCH
, yang akan menyebabkan eksekusi melompat ke CATCH
blok jika keparahannya 11 atau lebih tinggi:
BEGIN TRY
RAISERROR(N'Test', 16, 1);
SELECT 1; /* Not executed */
END TRY
BEGIN CATCH
SELECT 2; /* Executed */
END CATCH
BEGIN TRY
RAISERROR(N'Test', 10, 1);
SELECT 1; /* Executed */
END TRY
BEGIN CATCH
SELECT 2; /* Not executed */
END CATCH
Masalah terpisah adalah jika skrip membentang beberapa batch - RETURN
hanya akan keluar dari batch :
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
SELECT 2; /* Executed! */
Untuk memperbaiki ini, Anda dapat memeriksa @@ERROR
di awal setiap batch:
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
IF (@@ERROR != 0)
RETURN;
SELECT 2; /* Not executed */
Sunting: Seperti yang ditunjukkan Martin Smith dengan benar dalam komentar, ini hanya berfungsi untuk 2 kumpulan. Untuk memperluas ke 3 atau lebih batch, Anda dapat melakukan kesalahan peningkatan kaskade seperti itu (catatan: GOTO
metode ini tidak menyelesaikan masalah ini karena label target harus didefinisikan dalam batch):
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
IF (@@ERROR != 0)
BEGIN
RAISERROR(N'Error already raised. See previous errors.', 16, 1);
RETURN;
END
SELECT 2; /* Not executed */
GO
IF (@@ERROR != 0)
BEGIN
RAISERROR(N'Error already raised. See previous errors.', 16, 1);
RETURN;
END
SELECT 3; /* Not executed */
Atau, seperti yang dia tunjukkan, Anda dapat menggunakan SQLCMD
metode ini jika itu sesuai untuk lingkungan Anda.