The raiserror Metode
raiserror('Oh no a fatal error', 20, -1) with log
Ini akan menghentikan koneksi, sehingga menghentikan sisa skrip agar tidak berjalan.
Perhatikan bahwa tingkat keparahan 20 atau lebih tinggi dan WITH LOG
opsi diperlukan untuk bekerja dengan cara ini.
Ini bahkan berfungsi dengan pernyataan GO, mis.
print 'hi'
go
raiserror('Oh no a fatal error', 20, -1) with log
go
print 'ho'
Akan memberi Anda output:
hi
Msg 2745, Level 16, State 2, Line 1
Process ID 51 has raised user error 50000, severity 20. SQL Server is terminating this process.
Msg 50000, Level 20, State 1, Line 1
Oh no a fatal error
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Perhatikan bahwa 'ho' tidak dicetak.
CAVEAT:
- Ini hanya berfungsi jika Anda masuk sebagai admin (peran 'sysadmin'), dan juga membuat Anda tidak memiliki koneksi database.
- Jika Anda TIDAK masuk sebagai admin, panggilan RAISEERROR () itu sendiri akan gagal dan skrip akan terus dijalankan .
- Ketika dipanggil dengan sqlcmd.exe, kode keluar 2745 akan dilaporkan.
Referensi: http://www.mydatabasesupport.com/forums/ms-sqlserver/174037-sql-server-2000-abort-whole-script.html#post761334
Metode noexec
Metode lain yang berfungsi dengan pernyataan GO adalah set noexec on
. Ini menyebabkan sisa skrip dilewati. Itu tidak mengakhiri koneksi, tetapi Anda harus noexec
mematikan lagi sebelum perintah apa pun akan dijalankan.
Contoh:
print 'hi'
go
print 'Fatal error, script will not continue!'
set noexec on
print 'ho'
go
-- last line of the script
set noexec off -- Turn execution back on; only needed in SSMS, so as to be able
-- to run this script again in the same session.
Cukup gunakan RETURN (ini akan bekerja di dalam dan di luar prosedur tersimpan).
sumber
Jika Anda dapat menggunakan mode SQLCMD, maka mantra
(TERMASUK usus besar) akan menyebabkan RAISERROR untuk benar-benar menghentikan skrip. Misalnya,
akan menampilkan:
dan bets akan berhenti. Jika mode SQLCMD tidak diaktifkan, Anda akan mendapatkan kesalahan parse tentang titik dua. Sayangnya, ini tidak sepenuhnya anti-peluru seolah-olah skrip dijalankan tanpa berada dalam mode SQLCMD, SQL Managment Studio melaju melewati kesalahan waktu bahkan parse! Namun, jika Anda menjalankannya dari baris perintah, ini tidak masalah.
sumber
Saya tidak akan menggunakan RAISERROR- SQL memiliki pernyataan IF yang dapat digunakan untuk tujuan ini. Lakukan validasi dan pencarian Anda dan atur variabel lokal, lalu gunakan nilai variabel dalam pernyataan IF untuk membuat sisipan bersyarat.
Anda tidak perlu memeriksa hasil variabel dari setiap tes validasi. Anda biasanya dapat melakukan ini dengan hanya satu variabel bendera untuk mengonfirmasi semua kondisi yang diteruskan:
Meskipun validasi Anda lebih kompleks, Anda hanya perlu beberapa variabel flag untuk disertakan dalam pemeriksaan akhir Anda.
sumber
RAISERROR
, terutama jika Anda tidak tahu siapa yang akan menjalankan skrip dan dengan hak istimewa apa.declare @i int = 0; if @i=0 begin select '1st stmt in IF block' go end else begin select 'ELSE here' end go
Di SQL 2012+, Anda bisa menggunakan THROW .
Dari MSDN:
sumber
Saya berhasil memperluas solusi on / off noexec dengan transaksi untuk menjalankan script dengan cara apa pun atau tidak sama sekali.
Rupanya kompiler "memahami" variabel @finished di IF, bahkan jika ada kesalahan dan eksekusi dinonaktifkan. Namun, nilainya hanya 1 jika eksekusi tidak dinonaktifkan. Karenanya saya dapat dengan baik melakukan atau mengembalikan transaksi yang sesuai.
sumber
IF (XACT_STATE()) <> 1 BEGIN Set NOCOUNT OFF ;THROW 525600, 'Rolling back transaction.', 1 ROLLBACK TRANSACTION; set noexec on END;
Tetapi eksekusi tidak pernah berhenti, dan saya berakhir dengan tiga kesalahan "Rolling back Transaction". Ada ide?Anda bisa membungkus pernyataan SQL Anda dalam lingkaran WHILE dan menggunakan BREAK jika diperlukan
sumber
DECLARE @ST INT; SET @ST = 1; WHILE @ST = 1; BEGIN; SET @ST = 0; ...; END
Lebih banyak verbose, tapi sih, ini TSQL ;-)Anda dapat mengubah alur eksekusi menggunakan pernyataan GOTO :
sumber
Metode Sglasses refinig lebih lanjut, garis-garis di atas memaksa penggunaan mode SQLCMD, dan baik meredam skirpt jika tidak menggunakan mode SQLCMD atau menggunakan
:on error exit
untuk keluar dari kesalahan apa punCONTEXT_INFO digunakan untuk melacak keadaan.
sumber
Apakah ini prosedur yang tersimpan? Jika demikian, saya pikir Anda bisa melakukan Pengembalian, seperti "Kembali NULL";
sumber
Saya menyarankan agar Anda membungkus blok kode yang sesuai dalam blok coba tangkap. Anda kemudian dapat menggunakan acara Raiserror dengan tingkat keparahan 11 untuk memutuskan untuk menangkap blok jika Anda inginkan. Jika Anda hanya ingin meningkatkan kesalahan tetapi melanjutkan eksekusi dalam blok coba kemudian gunakan tingkat keparahan yang lebih rendah.
Masuk akal?
Cheers, John
[Diedit untuk memasukkan Referensi BOL]
http://msdn.microsoft.com/en-us/library/ms175976(SQL.90).aspx
sumber
Anda dapat menggunakan RAISERROR .
sumber
Tak satu pun dari ini bekerja dengan pernyataan 'GO'. Dalam kode ini, terlepas dari apakah tingkat keparahannya 10 atau 11, Anda mendapatkan pernyataan PRINT akhir.
Skrip Tes:
Hasil:
Satu-satunya cara untuk membuat karya ini adalah menulis skrip tanpa
GO
pernyataan. Terkadang itu mudah. Terkadang cukup sulit. (Gunakan sesuatu sepertiIF @error <> 0 BEGIN ...
.)sumber
saya menggunakan
RETURN
sini sepanjang waktu, bekerja dalam skrip atauStored Procedure
Pastikan Anda
ROLLBACK
melakukan transaksi jika berada dalam satu transaksi, jika tidakRETURN
segera akan menghasilkan transaksi terbuka tanpa komitmensumber
Ini solusi saya:
...
sumber
Anda dapat menggunakan pernyataan GOTO. Coba ini. Ini digunakan penuh untuk Anda.
sumber
Terima kasih untuk jawabannya!
raiserror()
berfungsi dengan baik tetapi Anda tidak harus melupakanreturn
pernyataan itu jika skrip berlanjut tanpa kesalahan! (Hense raiserror bukanlah "throwerror" ;-)) dan tentu saja melakukan rollback jika perlu!raiserror()
Adalah baik untuk memberi tahu orang yang mengeksekusi skrip bahwa ada kesalahan.sumber
Jika Anda hanya menjalankan skrip di Management Studio, dan ingin menghentikan transaksi eksekusi atau rollback (jika digunakan) pada kesalahan pertama, maka cara terbaik yang saya rasa adalah dengan menggunakan blok coba tangkap (SQL 2005 dan seterusnya). Ini bekerja dengan baik di studio Manajemen jika Anda mengeksekusi file skrip. Stored proc selalu dapat menggunakan ini juga.
sumber
Kembali pada hari kami menggunakan yang berikut ini ... berfungsi paling baik:
sumber
Lekatkan dalam blok coba tangkap, maka eksekusi akan ditransfer ke tangkapan.
sumber