Saya sedang mengerjakan skrip sql dan saya memiliki persyaratan untuk berhenti melanjutkan skrip jika beberapa kondisi tidak terpenuhi.
Ketika saya Google itu, saya menemukan RaisError dengan 20 tingkat keparahan akan menghentikannya. Tetapi untuk beberapa alasan saya tidak dapat menggunakan opsi itu.
Tolong beri saya alternatif apa yang memungkinkan untuk menghentikan eksekusi skrip SQL.
sql-server
sql-server-2005
error-handling
Pengembang Baru
sumber
sumber
Jawaban:
Dari dokumentasi RAISERROR (penekanan saya):
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:
Ini akan baik meningkatkan kesalahan dan mengembalikan hasil set.
Untuk segera menghentikan skrip, saya lebih suka menggunakan
RETURN
(menggunakanGOTO
konstruksi -type umumnya tidak disarankan di sebagian besar lingkaran pemrograman di mana alternatif ada):Atau atasi penggunaan kesalahan
TRY/CATCH
, yang akan menyebabkan eksekusi melompat keCATCH
blok jika keparahannya 11 atau lebih tinggi:Masalah terpisah adalah jika skrip membentang beberapa batch -
RETURN
hanya akan keluar dari batch :Untuk memperbaiki ini, Anda dapat memeriksa
@@ERROR
di awal setiap batch: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):Atau, seperti yang dia tunjukkan, Anda dapat menggunakan
SQLCMD
metode ini jika itu sesuai untuk lingkungan Anda.sumber
Anda dapat menggunakan
GOTO
pernyataan untuk melompat-lompat di mana pun Anda inginkan. Dengan kata lain, Anda mengalami kesalahan atau kondisi lain, dan Anda dapat memiliki label di bagian bawah skrip (yaituTheEndOfTheScript:
) dan hanya mengeluarkangoto TheEndOfTheScript;
pernyataan.Berikut ini adalah contoh cepat:
Output dari eksekusi ini adalah sebagai berikut:
Seperti yang Anda lihat,
GOTO
telah melewatkan mencetak pernyataan ketiga dan keempat dan langsung melompat ke label (TheEndOfTheScript
).sumber
Cara terbaik adalah dengan menggunakan SET NOEXEC ON
Anda dapat membaca lebih lanjut di sini: Cara BERHENTI atau ABORT atau BREAK pelaksanaan pernyataan dalam batch saat ini dan dalam batch berikutnya dipisahkan oleh Pernyataan GO berdasarkan beberapa kondisi dalam SQL SERVER
sumber
Setuju dengan
SET NOEXEC ON/OFF
, namun dalam Stored Procs (mengandung satu blok) saya cukup menggunakanRETURN
pernyataan.Peringatan: Dalam file skrip, jika Anda memiliki beberapa
GO
pernyataan,RETURN
hanya akan keluar dari blok saat ini dan melanjutkan dengan blok / batch berikutnya.Catatan:
GOTO
seharusnya merupakan praktik pengkodean yang buruk,TRY..CATCH
direkomendasikan penggunaan " ", seperti yang diperkenalkan sejak SQL Server 2008, diikutiTHROW
pada tahun 2012.sumber