2009-02-03 137 views

回答

192

做的easisest事情是包您的代碼在事務中,然後逐行執行每批T-SQL代碼。

例如,

Begin Transaction 

     -Do some T-SQL queries here. 

Rollback transaction -- OR commit transaction 

如果要合併的錯誤處理,你可以通過使用try ... catch塊這樣做。如果發生錯誤,您可以在catch塊中回滾tranasction。

例如:

USE AdventureWorks; 
GO 
BEGIN TRANSACTION; 

BEGIN TRY 
    -- Generate a constraint violation error. 
    DELETE FROM Production.Product 
    WHERE ProductID = 980; 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_SEVERITY() AS ErrorSeverity 
     ,ERROR_STATE() AS ErrorState 
     ,ERROR_PROCEDURE() AS ErrorProcedure 
     ,ERROR_LINE() AS ErrorLine 
     ,ERROR_MESSAGE() AS ErrorMessage; 

    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
END CATCH; 

IF @@TRANCOUNT > 0 
    COMMIT TRANSACTION; 
GO 

請訪問以下鏈接瞭解更多詳情。

http://msdn.microsoft.com/en-us/library/ms175976.aspx

希望這可以幫助,但請讓我知道,如果你需要更多的細節。

+1

嗨,感謝。我第一次在這裏看到@@ TRANCOUNT,你能告訴我在ROLLBACK處理之後發生了什麼「IF @@ TRANCOUNT> 0 COMMIT TRANSACTION」嗎? @@ TRANCOUNT有什麼價值?再次感謝。 – QMaster 2015-06-20 21:25:36

2

我想添加一點,你也可以(如果你正在寫的東西很複雜)添加一個測試變量來回滾,如果你處於測試模式。然後你可以一次執行整個事情。通常我還會添加代碼以查看各種操作的前後結果,特別是如果它是複雜的腳本。下面

實施例:

USE AdventureWorks; 
GO 
DECLARE @TEST INT = 1--1 is test mode, use zero when you are ready to execute 
BEGIN TRANSACTION; 

BEGIN TRY 
    IF @TEST= 1 
     BEGIN 
      SELECT *FROM Production.Product 
       WHERE ProductID = 980; 
     END  
    -- Generate a constraint violation error. 
    DELETE FROM Production.Product 
    WHERE ProductID = 980; 

    IF @TEST= 1 
     BEGIN 
      SELECT *FROM Production.Product 
       WHERE ProductID = 980; 
      IF @@TRANCOUNT > 0 
       ROLLBACK TRANSACTION; 
     END  
END TRY 

BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_SEVERITY() AS ErrorSeverity 
     ,ERROR_STATE() AS ErrorState 
     ,ERROR_PROCEDURE() AS ErrorProcedure 
     ,ERROR_LINE() AS ErrorLine 
     ,ERROR_MESSAGE() AS ErrorMessage; 

    IF @@TRANCOUNT > 0 
     ROLLBACK TRANSACTION; 
END CATCH; 

IF @@TRANCOUNT > 0 AND @TEST = 0 
    COMMIT TRANSACTION; 
GO 
相關問題