在C#中,您可以获取原始错误并使用传递的内部异常来跟踪执行路径(堆栈跟踪)。我想知道在嵌套2层或3层深的存储过程中发生错误时,如何使用sql server 2005中的错误处理try / catch来实现此目的。
我希望像ERROR_MESSAGE(),ERROR_LINE(),ERROR_PROCEDURE(),ERROR_SEVERITY()之类的函数可以轻松地向上传递,以便顶层存储的proc可以访问它们。
处理此问题的最佳方法是使用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块:
<root>
<a>
<ErrorMessage>Bad number set!</ErrorMessage>
<ErrorLine>6</ErrorLine>
<ErrorProcedure>SubProcedure</ErrorProcedure>
<ErrorSeverity>16</ErrorSeverity>
</a>
</root>
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。