SQL Server:尝试catch或@@ error获得更高效

时间:2014-09-19 01:54:36

标签: sql-server

我有两个SQL命令,对我来说都很好。

这是第一个:

DECLARE @SeqID  int,
    @RtnCode    int     
BEGIN TRY
   BEGIN TRANSACTION    
       INSERT INTO TableA (Name,Value) 
       VALUES (@Name,@Value)        

       SET @SeqID = SCOPE_IDENTITY()        

       Insert Into TableB(TableASeqID, Name, Vlaue) 
       Values (@SeqID, @Name, @Value)               

   COMMIT TRANSACTION   

   SET @RtnCode = '1'
   GOTO FINALMSG    
END TRY
BEGIN CATCH  
   IF XACT_STATE() <> 0 BEGIN
       ROLLBACK TRANSACTION     
       SET @RtnCode = '10001'
       GOTO FINALMSG
   END
END CATCH
FINALMSG:
BEGIN           
    SELECT
        @RtnCode
END

这是第二个:

DECLARE @SeqID  int,
        @RtnCode    int     
BEGIN TRANSACTION
    INSERT INTO TableA (Name, Value) 
    VALUES (@Name, @Value)  

    IF(@@ERROR <> 0 OR @@ROWCOUNT <> 1)
    BEGIN                           
        ROLLBACK TRAN   
        SET @RtnCode = '1001'
        GOTO FINALMSG           
    END 

    SET @SeqID = SCOPE_IDENTITY()   

    Insert Into TableB(TableASeqID, Name, Vlaue) 
    Values (@SeqID, @Name, @Value)  

    IF(@@ERROR <> 0 OR @@ROWCOUNT <> 1)
    BEGIN                           
        ROLLBACK TRAN   
        SET @RtnCode = '1001'
        GOTO FINALMSG           
    END 

    COMMIT TRANSACTION

    SET @RtnCode = '1'
    GOTO FINALMSG

FINALMSG:
    BEGIN           
        SELECT
            @RtnCode
    END

第一个命令通常用于我的工作,但DBA喜欢第二个命令。

我对此感到困惑。

哪种方式更有效率?

Try Catch是否比使用@@ERROR()的每个命令更具消费效率?

1 个答案:

答案 0 :(得分:0)

我无法想出使用@@RAISEERROR代替TRY-CATCH的理由 - 我不认为TRY-CATCH的效果会比@@RAISEERROR更好/更差。

  • TRY-CATCH可读性好很多,因此很容易 维护或进行更改 - 代码中的一个示例是 - 您不需要使用FINALMSG
  • 在第一组语句中包含GOTO块和TRY-CATCH语句
  • 可以使用THROW等功能,而不是处理@@RAISEERROR及其功能 参数

This文章详细介绍了TRY-CATCH-THROW及其好处。