SQL:尽量/试图访问一个表,它找不到抓时不捕获错误(SQL: Try/Catch doesn

2019-07-20 08:53发布

我创建了一个运行一些命令来修改数据的存储过程。 我只是想,如果一切成功提交事务。 我在下面的方式(其中真实的东西我CATCH块使用RAISERROR返回错误信息)使用try-catch块这样做:

BEGIN TRY
  BEGIN TRANSACTION
  UPDATE Table1 SET MyVarcharColumn = 'test'
  UPDATE Table2 SET MyBitColumn = 1
  UPDATE Table3 SET MyIntColumn = 42
  COMMIT TRANSACTION
END TRY
CATCH
  ROLLBACK TRANSACTION
END CATCH

这工作我想它的方式。 如果,例如,我设置MyBitColumn到“b”,而不是图1中,误差被捕获,向CATCH控制流,以及交易未被COMMITED。

有一个问题我注意到的是,如果说,表3不存在于数据库中,然后就出现了错误(无效的对象名称),但永远不会执行CATCH块和事务保持打开状态。

我想解决这个照顾任何(远程)可能性,即一个数据库被修改(或某事发生,其中该存储过程中正确添加,但其中一个表是不是)。

我应该如何处理这些错误情况?

-谢谢你的帮助。

Answer 1:

在你的脚本开始使用SET XACT_ABORT

SET XACT_ABORT ON

当SET XACT_ABORT为ON时,如果Transact-SQL语句产生运行时错误,整个交易被终止并回滚。

我不认为这将是可能的:

以下类型的错误,当他们出现在执行的TRY ... CATCH构造相同级别不catch块处理:

  • 编译错误,如语法错误,阻止了一批运行。

  • 在语句级重新编译发生的错误, 如因延迟名称解析编译后出现对象名解析错误。

参考 。

下面的例子演示了如何用SELECT语句生成的对象名解析错误不是由TRY ... CATCH构造抓住了,但是,当一个存储过程中执行相同的SELECT语句是由CATCH块捕获。

USE AdventureWorks2012;
GO

BEGIN TRY
    -- Table does not exist; object name resolution
    -- error not caught.
    SELECT * FROM NonexistentTable;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

是不是抓住了错误,并控制传递出来的尝试... CATCH构造到下一个更高的水平。



Answer 2:

EXECUTE ('SELECT * FROM NonexistentTable');


文章来源: SQL: Try/Catch doesn't catch an error when attempting to access a table that it can't find