Saya percaya ada beberapa pengecualian, tetapi dari Database Engine Error Severities (MSDN) :
Pesan kesalahan dengan tingkat keparahan 19 atau lebih tinggi menghentikan pelaksanaan batch saat ini.
Kesalahan yang mengakhiri koneksi database, biasanya dengan tingkat keparahan dari 20 hingga 25, tidak ditangani oleh blok CATCH karena eksekusi dibatalkan ketika koneksi berakhir.
Jadi sepertinya Anda bisa mendapatkan daftar definitif dari kueri berikut (tentu saja ini tidak akan memungkinkan Anda untuk menyaring yang mana yang dapat disebabkan oleh pengguna T-SQL):
SELECT message_id, severity, [text]
FROM sys.messages
WHERE language_id = 1033
AND severity >= 19
ORDER BY severity, message_id;
Di SQL Server 2012, ini menghasilkan 210 baris.
Di SQL Server 2016, ini menghasilkan 256 baris.
By the way, saya tidak percaya dua skenario yang Anda gambarkan dalam pertanyaan Anda bekerja seperti yang Anda pikirkan, setidaknya tidak dalam versi SQL Server modern. Saya mencoba ini pada 2012 dan 2016 (saya percaya artikel Erland menggambarkan perilaku SQL Server 2000, yang saya tidak ingat apakah itu berbeda, tetapi hari ini tidak terlalu relevan bahkan jika demikian).
USE tempdb;
GO
CREATE PROCEDURE dbo.pA -- no parameters
AS PRINT 1
GO
CREATE PROCEDURE dbo.pB -- two parameters
@x INT, @y INT
AS PRINT 1
GO
SET XACT_ABORT OFF;
GO
EXEC dbo.pA @foo = 1;
PRINT '### Calling procedure that doesn''t take parameters with a parameter';
GO
EXEC dbo.pB;
PRINT '### Calling procedure that takes 2 parameters with no parameters';
GO
EXEC dbo.pB @x = 1;
PRINT '### Calling procedure that takes 2 parameters with not enough parameters';
GO
EXEC dbo.pB @x = 1, @y = 2, @z = 3;
PRINT '### Calling procedure that takes 2 parameters with too many parameters';
GO
Ini semua menghasilkan kesalahan tingkat keparahan 16, dan semuanya melanjutkan dengan batch, sebagaimana dibuktikan oleh hasil cetak:
Msg 8146, Level 16, Negara 2, Prosedur pA, Baris 11
Prosedur pA tidak memiliki parameter dan argumen diberikan.
### Prosedur panggilan yang tidak mengambil parameter dengan parameter
Msg 201, Level 16,
Status 4, Prosedur pB, Prosedur Baris 14
atau fungsi 'pB' mengharapkan parameter '@x', yang tidak disertakan.
### Prosedur panggilan yang mengambil 2 parameter tanpa parameter
Msg 201, Level 16,
Status 4, Prosedur pB, Prosedur 18
atau fungsi 'pB' mengharapkan parameter '@y', yang tidak disediakan.
### Prosedur panggilan yang mengambil 2 parameter dengan tidak cukup parameter
Msg 8144, Level 16, Status 2, Prosedur pB, Baris 22
Prosedur atau fungsi pB memiliki terlalu banyak argumen yang ditentukan.
### Prosedur panggilan yang mengambil 2 parameter dengan terlalu banyak parameter
Seperti yang saya duga, ada pengecualian, tentu saja, seperti yang tercantum dalam komentar. Kegagalan konversi adalah tingkat keparahan 16 tetapi membatalkan kumpulan:
SET XACT_ABORT OFF;
SELECT CONVERT (INT, 'foo');
PRINT 'Made it.'; -- no print happens
Hasil tidak termasuk hasil cetak saat ini:
Msg 245, Level 16, Keadaan 1
Konversi gagal ketika mengonversi nilai varchar 'foo' ke int tipe data.
Selain jenis kesalahan yang dicatat oleh @ Harun (yaitu Tingkat Permasalahan > = 19 dan kegagalan konversi), jenis kesalahan berikut, yang dicatat di halaman MSDN untuk TRY ... CATCH , juga akan membatalkan bets:
Dalam contoh di bawah ini, harap dicatat bahwa tiga di antaranya bahkan Tingkat Keseriusan 15.
CONTOH 1
Pengembalian:
CONTOH 2
Pengembalian:
CONTOH 3
Pengembalian:
CONTOH 4
Pengembalian:
sumber