sql - 为什么这不能捕获存储过程中的错误?
问题描述
SQL Server 2014 (v12.0.5546) - 我有一个“主”存储过程,我从中运行了很多其他存储过程。如果出现错误,我希望它打印一行说明。
我今天运行它,主存储过程中的一个存储过程返回一个错误,说我正在尝试的表插入变量数量错误,但它没有打印错误。
我认为如果成功,存储过程会返回 0,因此除此之外的任何内容都意味着错误。我错了,还是我的流程有缺陷?
仅供参考,如果遇到错误,我不需要它停止运行,我只需要它吐出错误消息,这样我就知道它在哪里失败了。到这一切都说完了,这将增长到 20-30 个存储过程。
这是主存储过程:
ALTER PROCEDURE [dbo].[Master_CreateLoadTables]
AS
DECLARE @retval INT
-- Builds all tables required for the stored procedures
EXEC @retval = [BuildTables]
IF (@retval) = 0
BEGIN
SET @retval = 1
EXEC @retval = [Load_CustomerLookup]
IF (@retval) <> 0
PRINT 'Load of Customer Lookup Table Failed'
EXEC @retval = [Load_CustomerInvoices]
IF (@retval) <> 0
PRINT 'Load of Customer Invoice Tables Failed'
EXEC @retval = [Load_Payments]
IF (@retval) <> 0
PRINT 'Load of Payments Table Failed'
END
ELSE
PRINT 'Table Creation Failed'
解决方案
我认为如果成功,存储过程会返回 0,因此除此之外的任何内容都意味着错误。我错了,还是我的流程有缺陷?
存储过程返回您告诉它们的任何值。如果没有返回语句,则返回成功,0
.
普遍接受的做法是返回 0 表示成功,返回错误代码表示失败。但这不是强制执行的。
您指的是用户存储过程。您需要调查它们在您的环境中是如何工作的。
我还鼓励您将存储过程的主体放在begin
/end
块中。
推荐阅读
- jquery - 如何使用 jQuery 将属性值复制到兄弟属性
- bash - 在 PhpStorm 中使用一个快捷方式上传多个文件
- regex - 如何使用基于自定义关键字和正则表达式的应用程序脚本在谷歌驱动器中搜索文件?
- php - 包含反引号的字符串的意外 strcmp 行为
- scala - 使用案例类的折叠和空实例从 List[IO(Abstraction[List[A]]]] 移动到 IO[Abstraction[List[A]]]
- javascript - 单击按钮后如何将光标更改为自定义
- reactjs - 使用 django rest 序列化程序将数据添加到多个表
- ruby-on-rails - 无法在 Rails 6 上拯救 ActionDispatch::Http::Parameters::ParseError
- python - 是否有 NetworkX 算法可以找到从源到目标的最长路径?
- python - n 个变量之间的相等性