sql-server - 错误处理 - 确定 sp_executesql 是否是源

标签 sql-server tsql error-handling sp-executesql

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/

相关文章:

actionscript-3 - 错误1009无法再次访问属性

sql - INSTEAD OF 触发器和 CASCADE 路径

c# - Web API 错误 : "Cannot insert the value NULL into column ' Id'

sql - 如何在一个 LIKE 模式中描述以一个或两个数字结尾的字符串?

sql-server - 跨两列创建异或约束

sql - 连接两个具有不同数据的相同表结构

xml - 创建XML文件,尝试添加记录时出现错误

.net - 为什么linq查询不将 "where"放入SQL语句中

sql - 索引维护

HTML5 视频错误处理