- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含 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/
当我阅读 MSDN 的示例时 raiserror : RAISERROR (N'This is message %s %d.', -- Message text. 10, --
以下T-Sql代码: DECLARE @usu VARCHAR(10); SET @usu = 'TOM'; PRINT @usu; RAISERROR ('Name of USU is %i ',1
无论如何要打破线并在RaiseError的下一行继续?和 /n不工作 下面是我的代码: BEGIN BEGIN TRY SELECT 16/0 END TRY BEGIN CATCH
我正在尝试在查询中使用RAISERROR,但无法正常运行。毫无疑问,我正在尝试完全以错误的方式执行此操作。 例如,在下面的代码中,如果DestType字段为空或NULL,我希望它终止查询。 SELEC
我有一个包含 try-catch block 的存储过程。在 catch block 中,我调用 raiserror() 以在某些上下文中重新抛出错误。 我原以为如果发生错误,将调用 raiserro
我有一个包含 try-catch block 的存储过程。在 catch block 中,我调用 raiserror() 以在某些上下文中重新抛出错误。 我原以为如果发生错误,将调用 raiserro
我正在开发一个数据库和一些JSP页面来对其执行CRUD操作。 我无法在 JSP 代码中捕获与 SQL 代码相关的异常。 例如: 我在这部分代码中在 T-SQL 中引发了错误: IF @existing
CREATE TRIGGER x AFTER INSERT ON itemtype FOR EACH ROW DECLARE minn itemtype.PRICE%type; BEGIN s
我刚刚创建了一个 Instead After Trigger,其语法如下: Create trigger tgrInsteadTrigger on copytableto Instead of Ins
我有一些 3-4 个存储过程——如果需要我可以修改它们——它们使用 RAISERROR 来通知我的应用程序数据库端的一些 fatal error 。其中一些存储过程使用 ExecuteNonQuery
我使用 RAISERROR 从存储过程中生成进度输出而不是使用 PRINT,以避免 PRINT 对输出进行缓冲。现在我发现 RAISERROR 将在 500 次打印后开始缓冲。有没有办法解决这种行为?
这是我使用 tsqlt 的第一天,所以你可能会看到一些含糊的陈述。 我正在尝试测试一个具有 Try Catch Block 的存储过程,但测试中的实际语句是插入和更新命令。 现在我想测试如果出现 Er
我之前问过一个关于如何执行 PRINT 的问题,以便在脚本的其余部分仍在运行时立即提供输出(请参阅: How to see progress of running SQL stored procedu
能否不在 T-SQL 的 case 语句中引发错误?我总是遇到 SQL case 语句的问题:/ begin try declare @i int --set @i = (se
这里正确的语法是什么? If (@timestamp < (Select PromoStartTimestamp From @promo)) RAISERROR('Code not valid
MySQL 中相当于 SQL Server 中的 RAISERROR 的是什么? CREATE procedure GetallFiles() as begin if not exists(selec
(SQL 2005) raiserror 是否有可能终止存储过程。 例如,在一个大型系统中,我们有一个不希望输入到特定列中的值。在更新触发器中,如果你写: 如果存在(选择 * 从插入的地方 testc
我正在尝试在 SQL Server 2008 中创建一个存储过程。我有编程经验,但我无法弄清楚...也许我只是看它太久了!第一个示例引发了错误,但第二个示例没有...任何想法... ALTER PRO
为什么 RAISERROR 不拼写为 RAISEERROR?第二个E在哪里?我可以理解它是否是一些古老的关键字长度限制,但我不认为它是九个字符的限制。 RAIS 或 RROR 是一个技术词吗?“rai
我正在开发一个大型 SQL Server 代码库,其中一些代码库至少从 SQL 7 甚至更早的版本就开始开发了。 在整个代码库中,引发错误的方法是使用以下语法,据我所知,该语法未记录 RAISERRO
我是一名优秀的程序员,十分优秀!