当前位置: 首页 > 面试题库 >

SQL:尝试访问无法找到的表时,Try / Catch不会捕获错误

汤飞
2023-03-14
问题内容

我创建了一个存储过程,该过程运行许多命令来修改数据。如果一切成功,我只想提交事务。我通过以下方式使用try-
catch块来实现此目的(其中,真实的CATCH块使用RAISERROR返回错误消息):

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,并且未提交事务。

我注意到的一个问题是,如果说数据库中不存在Table3,则它会出错(无效的对象名),但是CATCH块将永远不会执行,并且事务保持打开状态。

我想处理此问题,以解决数据库被修改的任何(远程)可能性(或在适当添加此存储过程的情况下发生的事情,但其中一个表没有发生)。

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

-谢谢你的帮助。


问题答案:

在脚本的开头使用SET XACT_ABORT

SET XACT_ABORT ON

当SET XACT_ABORT为ON时,如果Transact-SQL语句引发运行时错误,则整个事务将终止并回滚。

我认为这是不可能的:

当以下几种类型的错误与TRY-ATCH构造在相同的执行级别上发生时,CATCH块将不对其进行处理:

  • 编译错误(例如语法错误)会阻止批处理运行。

  • 在语句级重新编译期间发生的错误, 例如由于延迟的名称解析而在编译后发生的对象名称解析错误。

参考。

下面的示例说明了由SELECT语句生成的对象名称解析错误是不是由TRY’ATCH构造捕获的,而由CATCH块捕获的,当在存储过程中执行相同的SELECT语句时,则如何捕获该错误。

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

错误未被捕获,控制权从TRY-ATCH构造传递到下一个更高级别。



 类似资料:
  • 我对CompletableFuture是个新手,我想调用一个可以引发异常的方法MetadataLoginutil::Login。然而,下面的代码没有编译,尽管我已经‘异常’编写。它说我必须在try&catch中包装metadataloginutil::login'。 请指教。前面谢谢!

  • 我正在尝试将错误捕获添加到组件的渲染函数中。当我在实际的渲染函数中抛出错误时,这可以正常工作,但是如果组件的子级中存在错误,则尝试不会捕获错误(或者它们被子组件错误处理程序拦截,我不确定? 是否存在将错误强制到父级的方法。 上述工作 这上面不抓

  • 问题内容: 因此,我希望我的第一级捕获是处理错误的捕获。反正有没有将我的错误传播到第一个陷阱? 参考代码,尚不可用: 问题答案: 使用新的异步/等待语法,您可以实现此目的。请注意,在编写本文时,并非所有浏览器都支持此功能,您可能需要使用babel(或类似的东西)来转换代码。

  • 我正在学习在SQL中使用Try…Catch和Transactions,我试图在我拥有的一些数据上测试这一点。据我所知,如果一次执行失败,那么catch将回滚整个批处理,因此TRY部分中的任何表都不应该被更新。然而,当我运行此操作时,它将在catch块中抛出@b表的错误,但它仍然会插入@a表的值 CATCH BLOCK运行,我看到error_number和error_message,但是第一个插入不

  • 问题内容: 我试图确保用户输入是整数,但是当我使用下面的代码时,我只会得到语句的无限循环。关于如何改进的任何建议? 问题答案: 不会消耗无效的输入,因此它将反复尝试读取相同的无效值。要解决此问题,您需要通过调用或接受任何值来显式使用它。 顺便说一句,为使您的代码更整洁并避免昂贵的操作(如创建异常),您应使用。 这是组织代码的方法

  • 问题内容: 当我在Chrome上运行测试时,经常会收到一个WebdriverException,指出Chrome无法访问。并非每次都这样。也许每15次一次。我必须在Windows计算机上运行所有程序,并且具有最新的Chrome,Chromedriver,Selenium- Webdriver版本。 我尝试设置环境变量“ DBUS_SESSION_BUS_ADDRESS = / dev / null