2

CATCH当块中遇到错误时,我想回滚块中的所有语句TRY

BEGIN TRY
    begin transaction

    create table t3(a int )
    insert into t3 values(1)
    insert into t3 values(1,2)  --error occur
    insert into t3 values(3)

END TRY
BEGIN CATCH
    --just take care of rollback
    IF @@TRANCOUNT <> 0
    BEGIN
        PRINT 'in catch,ROLLING BACK';
        ROLLBACK
    END
END CATCH
go

起初,由于CATCH块中的 PRINT 工作,错误被捕获。但是,经过多次来回更改,错误似乎不再被捕获,CATCH因为不再发生打印。

没有打印出来

因此,我打开一个新查询并执行相同的操作。这次错误可以再次被捕获!!

打印出来

对不起大图

4

1 回答 1

2

当您在管理工作室之类的工具中运行此代码时,您的事务将保留在您的 SPID(分配给查询窗口)中。

所以不一致的结果问题是因为您没有关闭所有代码路径上的事务(假设没有达到回滚),下次运行脚本时您的事务仍然处于活动状态。

如果您添加IF @@TRANCOUNT <> 0 rollback transaction到脚本的开头,您将获得一致的输出。

另请注意,该try catch块并不意味着在语句编译级别捕获错误。

如果您将错误替换为除以零,例如 ( print 1 / 0),则 catch 将正常工作。

MSDN中

以下类型的错误发生在与 TRY...CATCH 构造相同的执行级别时,不会由 CATCH 块处理:

编译错误,例如语法错误,阻止批处理运行。

  • 语句级重新编译期间发生的错误,例如对象名称解析
  • 由于延迟名称解析而在编译后发生的错误。
于 2013-07-04T01:58:29.700 回答