Sql-Server

SQL Server 中的批處理中止錯誤列表

  • January 18, 2016

在 SQL Server 中,如果 XACT_ABORT 關閉,則某些錯誤將終止目前語句(例如,向採用某些參數的儲存過程提供不正確數量的參數)並且某些錯誤將中止整個批處理(例如,將參數提供給儲存的不帶參數的過程)。

$$ Reference $$: http://www.sommarskog.se/error-handling-I.html#scope-abortion . 我想知道的是是否有一個明確的列表,哪些錯誤是批量中止,哪些是語句終止。

我相信有一些例外,但來自數據庫引擎錯誤嚴重性(MSDN)

嚴重級別為 19 或更高的錯誤消息會停止目前批處理的執行。

CATCH 塊不處理終止數據庫連接的錯誤,通常嚴重性從 20 到 25,因為連接終止時執行被中止。

因此,您似乎可以從以下查詢中獲得一個明確的列表(當然這不允許您過濾掉哪些可能是由使用者 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 年都嘗試過這個(我相信 Erland 的文章描述了 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 沒有提供參數和參數。

呼叫過程不使用參數

消息 201、級別 16、狀態 4、過程 pB、第 14 行

過程或函式“pB”需要未提供的參數“@x”。

呼叫過程需要 2 個沒有參數的參數

Msg 201,級別 16,狀態 4,過程 pB,第 18 行

過程或函式“pB”需要參數“@y”,但未提供該參數。

呼叫帶有 2 個參數但參數不足的過程

消息 8144,級別 16,狀態 2,過程 pB,第 22 行

過程或函式 pB 指定的參數過多。

呼叫帶有太多參數的 2 個參數的過程

正如我所懷疑的,當然,正如評論中所指出的那樣,也有例外。轉換失敗的嚴重性為 16,但會中止批處理:

SET XACT_ABORT OFF;
SELECT CONVERT (INT, 'foo');
PRINT 'Made it.'; -- no print happens

結果這次不包括列印輸出:

消息 245,級別 16,狀態 1

將 varchar 值“foo”轉換為數據類型 int 時轉換失敗。

引用自:https://dba.stackexchange.com/questions/126467