我有一个问题..在每个存储过程中我都有
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 =&gt; Fires SP2 =&gt; Fires SP3 =&gt; Fires SP4 =&gt;消防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
答案 0 :(得分:0)
你可以尝试这样的事情。只有最后一个嵌套事务才会记录它。 但是,如果调用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