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 GOTOkonstruksi -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 CATCHblok 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 - RETURNhanya 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: GOTOmetode 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 SQLCMDmetode ini jika itu sesuai untuk lingkungan Anda.