【问题标题】:SP error catchingSP 错误捕获
【发布时间】:2012-02-17 16:57:51
【问题描述】:

谁能推荐对以下存储过程代码的改进。

过去,在 C# 中进行事务并从那里回滚对我来说总是最好的,但现在我需要拥有事务并尝试在 SP 本身中捕获块。

我在 SP 中发现了很多事务示例,并尝试捕获块,但合并的并不多。

我想知道的是下面的代码:

  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
    

感谢 Manjunatha Gouli 的回复,

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

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

如果我使用 try catch 块,我什至需要在 SP 中检查 @@ERROR 吗?所有提到这个的文章都是为没有实现 try catch 的旧版 MS SQL 设计的吗?

【问题讨论】:

    标签: stored-procedures transactions try-catch


    【解决方案1】:

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

    开始尝试 开始交易 T1
    插入位置_内部(Loc_Ref、Loc_Code、Loc_Desc、Company_For_Desc、Row_Updated_PDA_Sync) 值(@Loc_Ref,@Loc_Code,@Loc_Desc,@Company_For_Desc,'无效值');

    COMMIT TRANSACTION T1
    RETURN 0;           
    

    结束尝试 开始捕捉 回滚交易 T1 返回@@错误; 结束捕获

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 1970-01-01
      • 2023-03-28
      • 2017-03-26
      • 2019-01-28
      • 1970-01-01
      • 2012-06-16
      • 2016-10-02
      • 2016-03-09
      相关资源
      最近更新 更多