sql-server - T-SQL 事务语法

标签 sql-server tsql azure-sql-database

我正在实现一个关键任务存储过程,它将执行 UPDATEDELETEINSERT ,我想确保我的 TRANSACTION 格式正确。

我见过一些 TRANSACTION 语句,其中每一步后都有一个检查。我也看到过这种类型,其中整个步骤集简单地放置在一个 TRANSACTION 块中,沿途没有任何“检查点”。

这是一个格式良好的 TRANSACTION ,如果在任何时候有任何错误,它会回滚所有内容,即 UPDATEDELETEINSERT

这是 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

最佳答案

您可以使用如下语法。请注意,当从 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

关于sql-server - T-SQL 事务语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48759706/

相关文章:

c# - 在 Azure ASP.NET 网站中选择地理坐标时出错

sql - 如何在 Microsoft Azure SQL 数据库中安排 SQL 作业?

asp.net - 从 Linux 应用服务计划中托管的 .NET Core Azure Web 应用连接到 SQL Server 2016 时出错

sql-server - 使用超前/滞后有额外的异常(exception)

tsql - T-SQL 右连接到所有条目包括选定的列

sql-server - MS SQL 服务器 : display blank for a zero-valued or NULL-valued integer field

azure-sql-database - 无法使用 Databricks 从 Azure 突触读取数据,且出现主 key 错误

sql - 查询未产生期望的结果

sql-server - 间歇性 SQL 异常 - 与网络相关或特定于实例的错误

sql - 当名称与表名相同时,内联索引定义失败