gpt4 book ai didi

stored-procedures - 嵌套存储过程异常处理

转载 作者:行者123 更新时间:2023-12-03 08:54:05 25 4
gpt4 key购买 nike

我有一个问题..在每个存储过程中

BEGIN TRY

命令和每个异常我登录到错误表。
但是现在我需要在另一个存储过程中执行存储过程,并且我意识到嵌套异常会被填充到父存储过程中,并在此之后进行记录。

这是每个存储过程中我的CATCH构造
BEGIN
BEGIN TRY
BEGIN TRANSACTION;

<CODE>

COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;

...
INSERT INTO ErrorLog (ObjectName...)
VALUES (OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)...)

RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH

示例场景可能是

SP1 =>触发SP2 =>触发SP3 =>触发SP4 =>触发SP5

如果在SP4中发生错误,将在错误表中插入行
SP1 : Error message from SP4
SP2 : Error message from SP4
SP3 : Error message from SP4

所以问题是我需要
SP4:来自SP4的错误消息
如果有可能我不需要
SP1 : Error message from SP4
SP2 : Error message from SP4
SP3 : Error message from SP4

错误表中的行。

我在做什么错,错误处理的最佳实践是什么?

有时我也会得到一个错误
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION

最佳答案

您可以尝试这样的事情。只有最后的嵌套事务会记录它。
但是,如果调用SP1的代码创建自己的事务,则我认为此解决方案不是很好。 @@ TRANCOUNT将大于1,并且代码必须处理日志。

BEGIN CATCH
Declare @count int
Set @count = @@TRANCOUNT

ROLLBACK TRANSACTION;

...

If (@count = 1)
Begin
INSERT INTO ErrorLog (ObjectName...)
VALUES (OBJECT_SCHEMA_NAME(@@PROCID) + '.' + OBJECT_NAME(@@PROCID)...)
End
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH

关于stored-procedures - 嵌套存储过程异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31875920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com