当前位置:  开发笔记 > 编程语言 > 正文

在MS SQL Server Management Studio中处理事务的最佳方法

如何解决《在MSSQLServerManagementStudio中处理事务的最佳方法》经验,为你挑选了2个好方法。

假设我有一个SQL语句,它在语法和语义上都是正确的,因此它会执行.

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



1> John Sansom..:

最简单的方法是将代码包装在事务中,然后逐行执行每批T-SQL代码.

例如,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction

如果要包含错误处理,可以使用TRY ... CATCH BLOCK来实现.如果发生错误,您可以回滚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

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


你好谢谢.我在这里第一次看到@@ TRANCOUNT,你能告诉我在ROLLBACK处理之后"IF @@ TRANCOUNT> 0 COMMIT TRANSACTION"会发生什么?@@ TRANCOUNT有什么价值?再次感谢.
执行完ROLLBACK TRANSACTION之后,@@ TRANCOUNT会重新设置为0。这样就不会执行COMMIT TRANSACTION。请参阅https://msdn.microsoft.com/de-de/library/ms187967.aspx

2> HLGEM..:

我想添加一点,如果您处于测试模式,则还可以(并且如果编写的内容很复杂)也可以将测试变量添加到回滚。然后,您可以立即执行整个操作。通常,我还会添加代码以查看各种操作的前后结果,特别是如果它是一个复杂的脚本。

下面的例子:

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

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有