任何人都可以推薦對以下存儲過程代碼進行改進。SP錯誤捕獲
在過去,對我來說最好的辦法是使用C#進行事務處理,然後從那裏回滾,但現在我需要在SP中擁有事務並嘗試catch塊。
我發現了很多SP中事務的例子,並嘗試catch塊,但沒有多少結合起來。
我想知道的是將下面的代碼:
捕獲所有錯誤的
除去SP崩潰或超時的所有風險,並留下交易公開,沒有推出返回
即使發生錯誤,也可以消除SP提交的所有風險。
SET NOCOUNT ON; SET XACT_ABORT ON; --used so transaction is not left open in the even of an error or timeout DECLARE @Error int BEGIN TRANSACTION BEGIN TRY INSERT INTO Locations_Internal (Loc_Ref, Loc_Code, Loc_Desc, Company_For_Desc, Row_Updated_PDA_Sync) VALUES (@Loc_Ref, @Loc_Code, @Loc_Desc, @Company_For_Desc, 'invalid value'); SELECT @Error [email protected]@ERROR; IF @@ERROR <> 0 GOTO ERR_HANDLER; --OTHER INSERT/DELETE/UPDATE Statements END TRY BEGIN CATCH SET @Error = @@ERROR; GOTO ERR_HANDLER; END CATCH COMMIT TRANSACTION RETURN 0; ERR_HANDLER: SELECT 'Unexpected error occurred!' ROLLBACK TRANSACTION RETURN @Error
感謝您的答覆Manjunatha溝裏,
想,如果插入語句失敗,但是不會崩潰,並拋出一個異常,它只是進行與的其餘部分的工作程序?這甚至有可能嗎?
我問,因爲我看過的大多數例子在每個INSERT/UPDATE/DELETE/SELECT語句後都檢查@@錯誤,這種方法在使用事務時仍然是必需的,或者每個錯誤都會被catch捕獲,而不僅僅是繼續執行代碼。
如果我使用try catch塊,我甚至需要打擾檢查SP中的@@ ERROR嗎?是否所有的文章都是針對這個設計的老版本的MS SQL,沒有實現try catch?