gpt4 book ai didi

sql - RAISERROR 何时在存储过程中触发?

转载 作者:行者123 更新时间:2023-12-01 22:38:49 26 4
gpt4 key购买 nike

我有一个包含 try-catch block 的存储过程。在 catch block 中,我调用 raiserror() 以在某些上下文中重新抛出错误。

我原以为如果发生错误,将调用 raiserror() 并且执行会立即从存储过程返回到调用代码。但是,情况似乎并非如此。看起来存储过程的执行一直持续到遇到 return 语句,然后 raiserror() 生效。

这是否正确 - 在调用 return 或到达存储过程的末尾之前,raiserror() 不会生效?

我使用的是 SQL Server 2012。

编辑:作为对存储过程详细信息请求的回复,这里是相关的代码片段:

DECLARE @ErrMsg VARCHAR(127) = 'Error in stored procedure ' + OBJECT_NAME(@@PROCID) + ': %s';

declare @UpdateDateRecordCount table (LastUpdated datetime, NumberRecords int);
begin try;
insert into @UpdateDateRecordCount (LastUpdated, NumberRecords)
exec sp_ExecuteSql
@UpdateCountQuery,
N'@LastUpdated datetime',
@LastUpdated = @LastUpdated;

if @@rowcount <= 0
begin;
return 0;
end;
end try
begin catch;
declare @InsertError varchar(128) = 'Error getting updated date record count: '
+ ERROR_MESSAGE();
RAISERROR (@ErrMsg, 16, 1, @InsertError);
end catch;

-- Attempt to loop through the records in @UpdateDateRecordCount...

@UpdateCountQuery 参数将被设置为如下内容:

N'select LastUpdated, count(*) from dbo.Part where LastUpdated > @LastUpdated group by LastUpdated;'

最佳答案

据我了解,如果你想停止执行,你需要在 TRY block 中引发错误,然后在你的 CATCH 中再次引发错误阻止这将确保将错误“引发”给调用者。

或者您可以在 CATCH block 中的 RAISERROR 语句之后添加一个 RETURN 语句。这将退出过程并返回给调用者。

此外,根据 MSDN 的建议,您应该尝试使用 THROW语句而不是 RAISERROR,因为它(RAISERROR)将被淘汰。

关于sql - RAISERROR 何时在存储过程中触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18222690/

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