Sql Server 2005错误处理-内部异常

标签 sql sql-server sql-server-2005 error-handling

在 C# 中,您可以获取原始错误并使用向上传递的内部异常来跟踪执行路径(堆栈跟踪)。我想知道当嵌套 2 或 3 层的存储过程中发生错误时,如何使用 sql server 2005 中的错误处理 try/catch 来实现这一点。

我希望 ERROR_MESSAGE()、ERROR_LINE()、ERROR_PROCEDURE()、ERROR_SEVERITY() 等函数可以轻松地向上传递,以便顶级存储过程可以访问它们。

最佳答案

处理此问题的最佳方法是使用 OUTPUT 参数和 XML。下面的示例代码将演示如何以及您可以修改对 TopProcedure 中的 XML 执行的操作,以更好地处理对错误的响应。

USE tempdb
go
CREATE PROCEDURE SubProcedure @RandomNumber int, @XMLErrors XML OUTPUT
AS
BEGIN
BEGIN TRY
    IF @RandomNumber > 50
        RaisError('Bad number set!',16,1)
    else
        select @RandomNumber
END TRY
BEGIN CATCH
    SET @XMLErrors = (SELECT * FROM (SELECT ERROR_MESSAGE() ErrorMessage, 
        ERROR_LINE() ErrorLine, ERROR_PROCEDURE() ErrorProcedure, 
        ERROR_SEVERITY() ErrorSeverity) a FOR XML AUTO, ELEMENTS, ROOT('root'))
END CATCH
END
go

CREATE PROCEDURE TopProcedure @RandomNumber int
AS
BEGIN
    declare @XMLErrors XML
    exec SubProcedure @RandomNumber, @XMLErrors OUTPUT
    IF @XMLErrors IS NOT NULL
        select @XMLErrors
END

go
exec TopProcedure 25
go
exec TopProcedure 55
go
DROP PROCEDURE TopProcedure
GO
DROP PROCEDURE SubProcedure
GO

对 TopProcedure 的初始调用将返回 25。第二个调用将返回如下所示的 XML block :

<root>
  <a>
    <ErrorMessage>Bad number set!</ErrorMessage>
    <ErrorLine>6</ErrorLine>
    <ErrorProcedure>SubProcedure</ErrorProcedure>
    <ErrorSeverity>16</ErrorSeverity>
  </a>
</root>

享受

关于Sql Server 2005错误处理-内部异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/87986/

相关文章:

sql - SQL中,去除相邻的重复行并进行时间计算

asp.net - 如何为 .NET 开发创建我的第一个数据库?

mysql - 处理 SQL 保留表名和列名

sql-server - 如何使用Web Service在HTML页面显示sql server数据的实际结果?

c# - 无法从 UWP 应用程序连接到 SQL Server Express 数据库

sql-server - 替换数据库中的阿拉伯字母

.net - 存储过程中END之后的语句是否执行?

winforms - sql server 2005 中的 Wingding 字符

mysql - 错误 1005 : Can't create table

javascript - 在查询生成器 Jquery 中获取 SQL 规则时,“IN”运算符无法正常工作