Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MS SQL Server Management Studio中处理事务的最佳方法_Sql_Tsql_Transactions - Fatal编程技术网

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

在MS SQL Server Management Studio中处理事务的最佳方法,sql,tsql,transactions,Sql,Tsql,Transactions,假设我有一个SQL语句,它在语法和语义上都是正确的,所以它可以执行 在ManagementStudio(或任何其他查询工具)中,我如何测试SQL语句,如果我注意到它们破坏了某些东西,则回滚(在单独的查询中?最简单的方法是将代码包装到事务中,然后逐行执行每批T-SQL代码 比如说, Begin Transaction -Do some T-SQL queries here. Rollback transaction -- OR commit transaction 如果您想

假设我有一个SQL语句,它在语法和语义上都是正确的,所以它可以执行


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

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

比如说,

Begin Transaction

         -Do some T-SQL queries here.

Rollback transaction -- OR commit transaction
如果您想合并错误处理,可以使用TRY…CATCH块。如果发生错误,您可以在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
有关更多详细信息,请参阅以下链接


希望这有帮助,但如果你需要更多的细节,请让我知道

我想添加一点,如果您在测试模式下,您还可以(如果您编写的内容很复杂,那么应该)添加一个测试变量以回滚。然后你就可以一次完成整个任务。我还经常添加代码来查看各种操作的前后结果,特别是如果它是一个复杂的脚本

示例如下:

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

嗨,谢谢。我第一次在这里看到了关于@TRANCOUNT的内容,您能告诉我回滚处理后“IF@@TRANCOUNT>0提交事务”会发生什么情况吗?“TRANCOUNT”有什么价值?再次感谢。在执行回滚事务后@@TRANCOUNT被设置回0。此时,提交事务将不会执行。看见