当 sp_executesql
返回错误消息时,是否有任何内置的错误处理方法/机制可用于识别此错误是由此过程返回的还是直接从包含的脚本?
在以下情况中,错误详细信息将错误标识为第 1 行发生的错误,但它们并不表示所引用的第 1 行不是第 1 行脚本本身 而是脚本传递给 sp_executesql
的查询中的第 1 行 。
我正在寻找某种方法来识别源,以便我可以相应地记录它。我想记录类似 Script x - Call to inner query errored on that query's line 1
而不是通用的(和误导性的)Script x errored on line 1
。
演示
-- do other things first
BEGIN TRY
EXECUTE sp_executesql @stmt = N'SELECT 1/0';
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage
END CATCH;
返回:
ErrorNumber ErrorSeverity ErrorState ErrorProcedure
----------- ------------- ----------- ---------------
8134 16 1 NULL
最佳答案
不幸的是,调用堆栈不适用于 T-SQL 错误处理。考虑投票 this feature request以便于捕获 T-SQL 堆栈详细信息。
下面的示例使用嵌套的 TRY/CATCH 在内部脚本出错时引发用户定义的错误(消息编号 50000),捕获可用的详细信息以及上下文描述(“内部脚本”)。当外部脚本中发生错误时,只需重新抛出原始错误。缺少上下文和系统错误号表示最外层的脚本出错,尽管您可以在那里构建并引发用户定义的错误,包括外部脚本上下文描述。
BEGIN TRY
BEGIN TRY
EXECUTE sp_executesql @stmt = N'SELECT 1/0;';
END TRY
BEGIN CATCH
DECLARE
@ErrorNumber int
,@ErrorMessage nvarchar(2048)
,@ErrorSeverity int
,@ErrorState int
,@ErrorLine int;
SELECT
@ErrorNumber =ERROR_NUMBER()
,@ErrorMessage =ERROR_MESSAGE()
,@ErrorSeverity = ERROR_SEVERITY()
,@ErrorState =ERROR_STATE()
,@ErrorLine =ERROR_LINE();
RAISERROR('Error %d caught in inner script at line %d: %s'
,@ErrorSeverity
,@ErrorState
,@ErrorNumber
,@ErrorLine
,@ErrorMessage);
END CATCH;
END TRY
BEGIN CATCH
THROW;
END CATCH;
GO
关于sql-server - 错误处理 - 确定 sp_executesql 是否是源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55871542/