首页 > 解决方案 > 控制 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-serverstored-procedurescontrol-m

解决方案


两点;

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

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

Actions --> On/Do actions --> on specific statement 输出 Statement * Code * RETURN_VALUE = ERROR * Do 设置为 NOTOK

例如,请参见此处 -

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


推荐阅读