我正在经历一些THROW
我无法理解的行为。考虑以下存储过程:
CREATE PROCEDURE usp_division_err AS
SET NOCOUNT ON;
BEGIN TRY
EXEC('select 1/0')
END TRY
BEGIN CATCH
THROW;
END CATCH
执行该过程时,会出现以下错误:
消息 8134,级别 16,状态 1,第 1 行
除以零时遇到错误。
请注意,不包含有关在哪个过程中引发错误的信息。那是因为错误的动态 SQL 是在另一个范围内执行的,这很好。但是,将CATCH
-block 更改为如下所示
BEGIN CATCH
THROW 50000, 'An error occurred.', 1;
END CATCH
并且该过程的执行将引发此错误:
消息 50000,级别 16,状态 1,过程 usp_division_err,第 7 行 [批起始行 0]
发生错误。
执行动态SQL时仍然遇到错误,但是当我手动指定错误号和错误信息( 的第一个和第二个参数THROW
)时,执行过程的过程名称莫名其妙地出现了。
为什么过程名称出现在第二条错误消息中而不是第一条错误消息中?
像这样编码
CATCH
:这允许您将所有参数传递到
THROW
语句中,以便它可以将它们发送回调用者。我这样测试过:
结果:
要获得本机错误号,您只需从报告的错误号中减去 50000。由于 for 的参数
THROW
是可选的,因此在 中必须有两个代码路径THROW
,一个报告过程名称,一个不报告过程名称。我将留给读者来决定哪个代码路径可以做到这一点。