Я вважаю, що є кілька винятків, але із суворості помилок двигуна бази даних (MSDN) :
Повідомлення про помилки з рівнем вираженості 19 або вище зупиняють виконання поточної партії.
Помилки, що припиняють підключення до бази даних, зазвичай із суворістю від 20 до 25, не обробляються блоком CATCH, оскільки виконання припиняється, коли з'єднання припиняється.
Отже, схоже, що ви можете отримати остаточний список із наступного запиту (звичайно, це не дозволить вам відфільтрувати, які з них можуть бути викликані користувачем T-SQL):
SELECT message_id, severity, [text]
FROM sys.messages
WHERE language_id = 1033
AND severity >= 19
ORDER BY severity, message_id;
У SQL Server 2012 це створює 210 рядків.
У SQL Server 2016 це створює 256 рядків.
До речі, я не вважаю, що два сценарії, які ви описуєте у своєму питанні, працюють так, як ви думаєте, принаймні, не в сучасних версіях SQL Server. Я спробував це і в 2012, і в 2016 (я вважаю, що стаття Ерланда описує поведінку SQL Server 2000, яку я не пам’ятаю, чи було це інакше, але не дуже актуально сьогодні, навіть якщо так).
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
Усі вони створюють помилки суворості 16 рівня, і всі вони переходять до партії, про що свідчить вихід друку:
Повідомлення 8146, рівень 16, стан 2, процедура pA, рядок 11
Процедура pA не має параметрів і аргументи були надані.
### Процедура виклику, яка не приймає параметри з параметром
Msg 201, Рівень 16, Стан 4, Процедура pB, Рядок 14
Процедура або функція 'pB' очікує, що параметр '@x', який не був наданий.
### Процедура виклику, яка приймає 2 параметри без параметрів
Msg 201, Рівень 16, Стан 4, Процедура pB, Рядок 18
Процедура або функція 'pB' очікує параметр '@y', який не був наданий.
### Процедура виклику, яка приймає 2 параметри з недостатньою кількістю параметрів
Msg 8144, Рівень 16, Стан 2, Процедура pB, Рядок 22
Процедура або функція pB задано занадто багато аргументів.
### Процедура виклику, яка приймає 2 параметри із занадто великою кількістю параметрів
Як я підозрював, звичайно, є винятки, як зазначено в коментарях. Невдача конверсії - це ступінь тяжкості 16, але перериває партію:
SET XACT_ABORT OFF;
SELECT CONVERT (INT, 'foo');
PRINT 'Made it.'; -- no print happens
Результати цього разу не включають вихід друку:
Msg 245, рівень 16, стан 1
Перетворення не вдалося при перетворенні значення varchar 'foo' у тип даних int.