Stored procedures SP错误捕获

Stored procedures SP错误捕获,stored-procedures,transactions,try-catch,Stored Procedures,Transactions,Try Catch,是否有人可以建议对以下存储过程代码进行改进 在过去,对我来说,最好是将事务放在C#中,然后从C#中回滚,但现在我需要将事务放在SP中并尝试catch块 我在SP和try catch块中找到了许多事务示例,但它们结合在一起的示例并不多 我想知道的是下面的代码: 抓住所有错误 消除SP崩溃或超时的所有风险,使交易保持打开状态而不回滚 消除SP提交的所有风险,即使发生错误 SET NOCOUNT ON; SET XACT_ABORT ON; --used so transaction is not l

是否有人可以建议对以下存储过程代码进行改进

在过去,对我来说,最好是将事务放在C#中,然后从C#中回滚,但现在我需要将事务放在SP中并尝试catch块

我在SP和try 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 =@@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
    
    设置不计数;
    将XACT_ABORT设置为ON--用于使事务在发生错误或超时时不会保持打开状态
    声明@Error int
    开始交易
    开始尝试
    插入位置\内部(位置\参考、位置\代码、位置\说明、公司\说明、行\更新\ PDA \同步)
    值(@Loc_Ref、@Loc_Code、@Loc_Desc、@Company_For_Desc,‘无效值’);
    选择@Error=@@Error;
    如果@错误0转到错误处理程序;
    --其他插入/删除/更新语句
    结束尝试
    开始捕捉
    设置@Error=@@Error;
    GOTO ERR_HANDLER;
    端接
    提交事务
    返回0;
    错误处理程序:
    选择“发生意外错误!”
    回滚事务
    返回@Error
    

  • 感谢Manjunatha Gouli的回复

    如果insert语句失败,但没有崩溃并抛出一个异常(它只是在过程的其余部分继续进行),那么这是否可行?这可能吗

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


    如果我正在使用try-catch块,我甚至需要麻烦检查SP中的@错误吗?是否所有提及此的文章都是为没有实现try-catch的较早版本的MS SQL设计的?

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

    开始尝试 开始事务T1
    插入位置\内部(位置\参考、位置\代码、位置\说明、公司\说明、行\更新\ PDA \同步) 值(@Loc_Ref、@Loc_Code、@Loc_Desc、@Company_For_Desc,‘无效值’)

    结束尝试 开始捕捉 回滚事务T1 返回@错误; 端接

    COMMIT TRANSACTION T1
    RETURN 0;