2012-04-06 55 views
2

我有一個包含多個更新和插入查詢的SP。如果任何查詢給出錯誤,執行是否轉移到下一個語句?例如,在SQL Server中,如果第一條語句拋出錯誤,執行是否會移至下一條語句?

CREATE PROCEDURE Test() 
AS 
BEGIN 
    INSERT INTO SomeTable VALUES (1, 2, 3) 
    UPDATE SomeTable SET X = 4 WHERE Y = 5 
END 

在上面的例子中,如果INSERT語句拋出錯誤,會執行移動到下一個UPDATE語句嗎?

+0

有時。看看XACT_ABORT。 – 2012-04-06 21:54:28

+5

「這取決於」。錯誤可以執行以下任何連接終止,範圍墮胎。聲明終止和批次墮胎。並不總是很直觀地預測特定錯誤的類別。請參見[SQL 2000中的錯誤處理 - 背景](http://www.sommarskog.se/error-handling-I.html) – 2012-04-06 21:55:37

+0

@ ta.speot.is我認爲XACT_ABORT OFF | ON只適用於批次。 – 2012-04-06 22:02:41

回答

1

這取決於error severity。從嚴重級19開始,批處理會中止:

指示超出了不可配置的數據庫引擎限制,並且當前批處理進程已終止。錯誤 嚴重性級別等於或高於19的消息會停止執行當前批次的 。

然而請注意,如果代碼上方的BEGIN TRY/BEGIN CATCH塊內運行(或從這樣的塊稱爲),然後用10-18嚴重性導致錯誤的控制流程跳到catch塊(這是不就像執行中止一樣),因此下一條語句將會執行而不是

此外,XACT_ABORT設置還會導致當前事務回滾當前批次中止。

如果你想怎麼寫固態存儲過程的代碼模板,請參閱Exception handling and nested transactions

+0

請參考[鏈接](http://www.sommarskog.se/error_handling_2005.html)按照SQL Server 2005進行錯誤處理 – 2012-04-09 16:16:36

相關問題