sql - Rollback 和 RaiseError,哪个先?

标签 sql sql-server sql-server-2008 rollback raiseerror

我有时会按以下顺序执行以下一组语句:

Raiseerror(...)
Rollback;

但我想知道它是否会产生与下面相同的效果:

Rollback;
Raiseerror(...)

我知道它们是相同的并且会产生相同的效果。先做Rollback,执行完后继续执行下一行,即Raiseerrror(...)

有人可以证实这一点吗?或者更适合以具体的方式执行这组语句?

最佳答案

如果您位于 TRY-CATCH block 中,那就很重要了 - raiserror 会将执行转移到 catch block ,因此如果回滚发生在它之后(在 try block 内),那么它将不会执行。

此外,这还取决于错误的严重性 - 严重性 20+ 会终止数据库连接。

一个很好用的模式是这样的

begin try
    begin transaction;

    -- do stuff

    commit transaction;
end try
begin catch
    declare @ErrorMessage nvarchar(max), 
        @ErrorSeverity int, 
        @ErrorState int;

    select @ErrorMessage = ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();

    if @@trancount > 0
        rollback transaction;

    raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
end catch

关于sql - Rollback 和 RaiseError,哪个先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40691304/

相关文章:

sql-server - 如何在 SQL Server 中创建文件格式

sql - 如何用单引号包裹我的查询输出

python - 将变量用于带有 python sql 游标的表名

.net - VB.Net 使用创建表查询将 MS Access 表中的 AllowZeroLength 属性设置为“否”

sql - 在不同行中显示两列的重复值

sql - 在 hive 表中导入系统名称、系统当前日期、时间

SQL,如何转换为逻辑 ('not in' 到 'not exists' )

sql - SSIS:以编程方式生成创建表 DDL

sql - 检测有序列表中变化的函数

SQL:具有不同类型参数的 ISNULL 函数