Control 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,Line 8 [Batch Start Line 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

版本是:

因此忽略错误。我怎样才能截获错误

解决方法

两点;

  1. 您是否通过 Control-M for Databases 运行此程序?它是一个在 Control-M 代理下运行的模块,可让您更好地控制 DB 作业。如果您计划运行大量存储过程等,这绝对值得考虑。

  2. Windows 在退出代码(或返回代码,使用大男孩术语)方面是出了名的糟糕。在任务清除失败的情况下,您会收到退出代码 = 0。 Control-M 输出是“标准输出”(在 Unix 术语中)的任何内容。幸运的是 Control-M 可以捕获文本字符串,这在无法依赖退出代码时非常方便。只需在后期处理(即最后一个选项卡)中执行此操作 -

操作 --> 执行/执行操作 --> 在特定语句输出上 陈述 * 代码 * RETURN_VALUE = 错误 * 设置为NOTOK

参见此处的示例 -

https://community.bmc.com/s/article/How-to-use-On-specific-statement-output-in-a-Control-M-job-definition-s-On-Do-Actions