控件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

如果我在SQLServerManagementStudio中运行此程序,我会出现一个错误,并得到以下输出:

让我们试试程序[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 Server 2017
  • Control-M数据库9.0.19.200

因此忽略错误。如何拦截错误?

两点;

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

  2. 众所周知,Windows的退出代码(或返回代码,用大男孩的术语来说(很糟糕。如果任务清除失败,则会得到一个退出代码=0。Control-M的输出是"0"中的任何输出;标准输出";(用Unix术语(。幸运的是,Control-M可以捕获文本字符串,这在无法依赖退出代码时非常方便。只需在后处理(即最后一个选项卡(-中执行此操作

操作-->On/Do操作-->关于特定语句输出声明*代码*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

相关内容

最新更新