sql-server - 控制 M 不会从存储过程中得到错误
问题描述
我有一个非常简单的存储过程。这里只是一个可以重现错误的示例。我想在 Control-M 下安排一些程序并避免大量应用程序。
我添加了一个简单的 THROW,以便出现错误。过去由应用程序处理的类似错误。这里有一个例子:
ALTER PROCEDURE [dbo].[test_my_error] AS
BEGIN
DECLARE @divide INT = 0
BEGIN TRY
PRINT 'Let''s try procedure [test_my_error]'
SELECT 100 / @divide
END TRY
BEGIN CATCH
--This is just a test
THROW;
END CATCH
END
如果我在 SQL Server Management Studio 中运行它,则会出现错误和以下输出:
让我们试试程序 [test_my_error]
(0 行受影响)消息 8134,级别 16,状态 1,过程 test_my_error,第 8 行 [批处理开始行 0] 遇到除以零错误。
这是我所期望的。
然后我在 Control-M 中建立我的工作,我有这个日志:
16:13:29 14/06/2021 SUBMITTED TO host01 5105 16:13:29
14/06/2021 STARTED AT 20210614161329 ON host01 5101 16:13:29
14/06/2021 JOB STATE CHANGED TO Executing 5120 16:13:30
14/06/2021 ENDED AT 20210614161330. OSCOMPSTAT 0. RUNCNT 7 5100
16:13:30 14/06/2021 ENDED OK. NUMBER OF FAILURES SET TO 0 5133
16:13:30 14/06/2021 JOB STATE CHANGED TO Analyzed 5120 16:13:30
14/06/2021 Job STATE CHANGED TO Post processed 5120
在输出中:
Statement Messages:
-------------------
Let's try procedure [test_my_error]
@RETURN_VALUE = ERROR
Exit Code = 0
Exit Message = Normal completion
版本是:
- SQL 服务器 2017
- 用于数据库的 Control-M 9.0.19.200
所以错误被忽略。我怎样才能截获错误?
解决方案
两点;
您是通过 Control-M for Databases 运行它吗?它是一个在 Control-M 代理下运行的模块,可让您更好地控制数据库作业。如果您计划运行大量存储的过程等,绝对值得考虑。
Windows 的退出代码(或返回代码,使用大男孩术语)是出了名的糟糕。在任务清除失败的情况下,您会得到退出代码 = 0。Control-M 输出是“标准输出”(在 Unix 术语中)中的任何内容。幸运的是,Control-M 可以捕获文本字符串,这在无法依赖退出代码时非常方便。只需在后处理(即最后一个选项卡)中执行此操作 -
Actions --> On/Do actions --> on specific statement 输出 Statement * Code * RETURN_VALUE = ERROR * Do 设置为 NOTOK
例如,请参见此处 -
推荐阅读
- php - 使用 html 和 php 放置在表单中的 echo 中时,提交按钮不起作用
- python - 熊猫中的菲尔娜
- html - 试图将地图的位置更改为粘性
- java - 如何在不覆盖 Spring MVC 控制器的情况下在根路径上声明 Servlet
- wpf - 跨不同窗口中不同控件的 wpf 绑定同步
- django - 通过代码运行流程 Django-Viewflow
- php - WordPress 如果 post.php 但仅适用于一种自定义帖子类型
- algorithm - 使用优先队列查找 a^3 + b^3 = c^3 + d^3 的所有解,其中 a,b,c,d 位于 [0,10^5] 之间
- excel - 通过公式或 UDF 定义命名范围
- java - 如何从 Web 服务中提取所有信息?