2014-09-19 19 views
1

我有兩個SQL命令,這兩個命令對我來說都很好。SQL Server:try catch或@@ error獲得更高效

這是第一個:

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喜歡第二個。

我對此感到困惑。

哪種方法更有效率?

Is Try Catch比每個命令使用更多的消耗效率使用@@ERROR()

+2

TRY/CATCH對於程序員來說是更現代和更簡單的方式 - 對@@ ERROR進行檢查是老式的,經過充分測試的版本,許多DBA都喜歡(因爲它們往往是保守的,經常不喜歡新的做事方式)。就個人而言:我總是比較喜歡'TRY/CATCH',因爲它使代碼變得更加簡潔 - 您可以省去在代碼中每隔一秒或三行檢查一次'@@ ERROR'。 – 2014-09-19 05:02:19

+1

同意@marc_s ,對於代碼可讀性,TRY/CATCH更爲可取。對性能的影響將非常小,如果存在差異,那麼與查詢花費的時間相比,這將是微不足道的。 – 2014-09-19 07:43:51

回答

0

我不能想出一個理由使用@@RAISEERROR而不是TRY-CATCH - 我不認爲TRY-CATCH會表現得更好/猶有@@RAISEERROR

  • TRY-CATCH可讀性好很多,從而很容易 維持或變更 - 從你的代碼的一個例子是 - 你不需要使用TRY-CATCH
  • 到在你的第一套報表 FINALMSG塊和 GOTO聲明
  • 可以使用的功能,如THROW,而不是處理@@RAISEERROR及其 參數

This文章對012的詳細信息及其好處。