SQL Server 中的批處理中止錯誤列表
在 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 時轉換失敗。