【问题标题】:Best way to work with transactions in MS SQL Server Management Studio在 MS SQL Server Management Studio 中处理事务的最佳方式
【发布时间】:2010-10-05 03:07:58
【问题描述】:

假设我有一个语法和语义正确的 SQL 语句,因此它可以执行。

在 Management Studio(或任何其他查询工具)中,我如何测试 SQL 语句,如果我发现它们破坏了某些内容,则回滚(在单独的查询中?)

【问题讨论】:

    标签: sql tsql transactions


    【解决方案1】:

    最简单的做法是将你的代码包装在一个事务中,然后逐行执行每批 T-SQL 代码。

    例如,

    Begin Transaction
    
             -Do some T-SQL queries here.
    
    Rollback transaction -- OR commit transaction
    

    如果您想合并错误处理,您可以使用 TRY...CATCH BLOCK 来实现。如果发生错误,您可以在 catch 块中回滚事务。

    例如:

    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

    希望这会有所帮助,但如果您需要更多详细信息,请告诉我。

    【讨论】:

    • 嗨,谢谢。我在这里第一次看到@@TRANCOUNT,你能告诉我在回滚处理后“IF @@TRANCOUNT > 0 COMMIT TRANSACTION”会发生什么吗? @@TRANCOUNT 有什么价值?再次感谢。
    • 在执行 ROLLBACK TRANSACTION 后,@@TRANCOUNT 被设置回 0。这样,COMMIT TRANSACTION 将不会被执行。见msdn.microsoft.com/de-de/library/ms187967.aspx
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多