T-SQL事务语法

Sam*_*Sam 5 t-sql sql-server azure-sql-database

我执行,将执行关键任务的存储过程UPDATE,DELETE并且INSERT我想确保我TRANSACTION是正确形成.

我已经看到了一些TRANSACTION声明,每个步骤后都有一个检查.我也看到过这种情况,整个步骤简单地放在一个TRANSACTION区块内,一路上没有任何"检查点".

这是一个很好形成TRANSACTION,将即回滚一切UPDATE,DELETE并且INSERT,如果在任何时候任何的错误.

这是TRANSACTION:

BEGIN TRANSACTION

BEGIN TRY

   UPDATE SomeTable
   SET SomeColumnValue = 123
   WHERE Id = 123456

   DELETE FROM SomeOtherTable
   WHERE Id = 789

   INSERT INTO ThirdTable
      (Column1, Column2)
   VALUE
      ('Hello World', 1234567)  

END TRY
BEGIN CATCH

   ROLLBACK TRANSACTION

END CATCH
Run Code Online (Sandbox Code Playgroud)

Dhr*_*shi 3

您可以使用如下语法。请注意,当从 begin try 块内部调用另一个具有类似结构的 SP 时,该语法还会处理嵌套事务

BEGIN TRAN

BEGIN TRY

    UPDATE SomeTable
    SET SomeColumnValue = 123
    WHERE Id = 123456

    DELETE FROM SomeOtherTable
    WHERE Id = 789

    INSERT INTO ThirdTable
    (Column1, Column2)
    VALUE
    ('Hello World', 1234567)  

    COMMIT TRAN

END TRY
BEGIN CATCH

    IF @@TRANCOUNT > 0
    ROLLBACK TRAN;

    INSERT INTO LogError (
                        --ErrorID
                        objectName
                        ,ErrorCode
                        ,ErrorDescription
                        ,ErrorGenerationTime            
                             )
    SELECT  
                        -- autogenerated
                        OBJECT_NAME(@@PROCID)
                        ,ERROR_NUMBER() AS ErrorCode
                        ,'Error of Severity: ' + CAST (ERROR_SEVERITY() AS VARCHAR (4))
                         +' and State: ' + CAST (ERROR_STATE() AS VARCHAR (8))
                         +' occured in Line: ' + CAST (ERROR_LINE() AS VARCHAR (10))
                         +' with following Message: ' + ERROR_MESSAGE() AS ErrorColumnDescription
                        ,GETDATE()
END CATCH
Run Code Online (Sandbox Code Playgroud)