【问题标题】:How do I get an error message returned to my stored procedure?如何将错误消息返回到我的存储过程?
【发布时间】:2021-08-14 23:05:48
【问题描述】:

我像这样从 StoredProcB 调用 StoredProcA:

EXEC StoredProcA(@a,@b,@c)

StoredProcA 有类似这样的代码:

do some stuff...
if @a < @b
insert into TableX(ItemNo, ItemDescr, ItemCost)
values(@q, @r, @c)

if @@ERROR <> 0 begin
rollback transaction
raiserror('Insert into TableX failed', 16, 1)
return
end
do more stuff...

那么,当我从 StoredProcB 调用 StoredProcA 时,如何将错误消息返回给 StoredProcB 并为其分配一个变量?

另外,我不能以任何方式更改 StoredProcA。

我想应该是这样的:

declare @err_msg varchar(50)
EXEC @err_msg = StoredProcA(@a,@b,@c)
update MyTable Set Result = @err_msg Where Cost = @a

但我就是想不通确切的语法...

【问题讨论】:

  • 给错误赋值是什么意思?同样根据documentation,您应该真正使用THROW 而不是RAISERROR
  • 这是一个存储过程,用于我正在尝试对其进行大规模更新的应用程序。所以代码不属于我,我无法更改。有关更多信息,请参阅我的编辑。

标签: sql-server tsql sql-server-2016


【解决方案1】:

您需要使用 T-SQL 结构化错误处理来捕获错误消息文本并在 catch 块中使用 ERROR_MESSAGE() 引用:

    BEGIN TRY
        EXEC StoredProcA @a, @b, @c;
    END TRY
    BEGIN CATCH
        UPDATE dbo.MyTable SET Result = ERROR_MESSAGE() WHERE Cost = @a;
    END CATCH;

【讨论】:

  • 这很棒 - 我知道这很简单。你也需要 END CATCH 而不是 END
  • @HereBeBeer,Charlieface 很友好地修复了我的复制\粘贴错误。请将此标记为您问题的答案,以便其他有类似问题的人更好地了解。
猜你喜欢
  • 2016-01-21
  • 2012-01-25
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多