2012-02-17 76 views
0

任何人都可以推薦對以下存儲過程代碼進行改進。SP錯誤捕獲

在過去,對我來說最好的辦法是使用C#進行事務處理,然後從那裏回滾,但現在我需要在SP中擁有事務並嘗試catch塊。

我發現了很多SP中事務的例子,並嘗試catch塊,但沒有多少結合起來。

我想知道的是將下面的代碼:

  1. 捕獲所有錯誤的

  2. 除去SP崩潰或超時的所有風險,並留下交易公開,沒有推出返回

  3. 即使發生錯誤,也可以消除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?

回答

0

您可以嘗試以下方法來解決您提出的所有問題。

BEGIN TRY BEGIN TRANSACTION T1
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, '無效值');

COMMIT TRANSACTION T1 
RETURN 0;   

END TRY BEGIN CATCH 回滾事務T1 RETURN @@ ERROR; END CATCH