SP错误捕获

时间:2012-02-17 16:57:52

标签: stored-procedures transactions try-catch

任何人都可以推荐对以下商店程序代码进行改进。

在过去,我总是最好在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 =@@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
    

  4. 感谢Manjunatha Gouli的回复,

    如果插入语句失败但是没有崩溃并抛出异常它会继续执行其余的过程吗?这甚至可能吗?

    我问,因为我看到的大多数示例都是在每次INSERT / UPDATE / DELETE / SELECT语句后检查@@ error,这种方法在使用事务时仍然需要,或者每个错误都会被catch捕获而不是继续用代码。

    如果我正在使用try catch块,我是否需要在SP中检查@@ ERROR?是否所有引用此文章的文章都是为没有实现try catch的旧版MS SQL设计的?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法来解决您提出的所有问题。

开始尝试     开始交易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;           

结束 开始捕捉     ROLLBACK TRANSACTION T1     RETURN @@ ERROR; END CATCH