2012-02-17 104 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