0

我在 sql server 数据库中有一个触发器,行为非常奇怪,这些是奇怪的指令:

...
EXEC  [ope].[spMissionDepartment] @AircraftId = @vnAircraftId

RAISERROR('test error', 16, 1)

END TRY 
BEGIN CATCH
    SELECT @ErrorMessage = ERROR_MESSAGE()

    ROLLBACK TRANSACTION

    RAISERROR(@ErrorMessage, 16, 1) -- strange line

END CATCH

奇怪的行为是这样的:
如果我删除奇怪的行而不是在网页中收到错误

超时。在操作完成或服务器没有响应之前的超时时间已过。

否则,如果我删除奇怪的行,我会收到错误

测试错误

没有其他触发器,所以exec应该是最后执行的语句,我怎么可能只收到一个 Timeout 而没有Raiserror

4

1 回答 1

0

不受 TRY…CATCH 构造影响的错误 TRY…CATCH 构造不会捕获以下情况:

  1. 严重性为 10 或更低的警告或信息性消息。
  2. 严重性为 20 或更高的错误会停止会话的 SQL Server 数据库引擎任务处理。如果发生严重程度为 20 或更高的错误并且数据库连接未中断,则 TRY...CATCH 将处理该错误。
  3. 注意,例如客户端中断请求或断开的客户端连接。
  4. 当系统管理员使用 KILL 语句结束会话时。

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

  1. 编译错误,例如语法错误,阻止批处理运行。
  2. 在语句级重新编译期间发生的错误,例如由于延迟名称解析而在编译后发生的对象名称解析错误。
于 2017-04-14T13:13:25.540 回答