2009-02-03 62 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 
相关问题