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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于在 MS SQL Server Management Studio 中处理事务的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

UTF-8 字符在 MS-SQL-Server 上的 INSERT 语句中发生更改

[MS SQL Server]SQL Server如何开启远程访问

如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行

如何检查 SQL 脚本是不是在 MS SQL Server 中成功执行?

MS 访问 SQL Server?

powershell MS SQL Powershell连接到SQL Server