SQL 代理作业不是 运行 所有步骤

SQL Agent Job Not Running all the steps

我有一个 SQL 代理作业,如果给定日期的另一个 table 中有 HOLIDAYCD,它应该会抑制来自 运行 的作业。它是 运行 并且正在执行第一个 exec,但其余的不是 运行。这是代码:

IF EXISTS (SELECT HOLIDAYCD FROM CORE.dbo.BANKORGYEARMONTHDAY WHERE CAST(EFFDATE AS DATE) = CAST(GETDATE() AS DATE))
BEGIN
    --On a holiday disable the following jobs
    exec msdb..sp_update_job @job_name = 'CORE imports', @enabled = 0
    exec msdb..sp_update_job @job_name = '086BAE49-50CE-4B87-A8C2-A9386ABEE9D9', @enabled = 0
    exec msdb..sp_update_job @job_name = '82499D43-2884-4E16-A514-7B666F5AF095', @enabled = 0
    exec msdb..sp_update_job @job_name = '2581BD28-FA33-48C6-B9E1-7B91C432A2B0', @enabled = 0
END
ELSE
    --On a normal business day, ensure they are enabled
    exec msdb..sp_update_job @job_name = 'CORE imports', @enabled = 1
    exec msdb..sp_update_job @job_name = '086BAE49-50CE-4B87-A8C2-A9386ABEE9D9', @enabled = 1
    exec msdb..sp_update_job @job_name = '82499D43-2884-4E16-A514-7B666F5AF095', @enabled = 1
    exec msdb..sp_update_job @job_name = '2581BD28-FA33-48C6-B9E1-7B91C432A2B0', @enabled = 1

所以发生的事情是 'CORE imports' 作业被禁用,但是 none 的 SSRS 作业被禁用。有没有更好的方法来停止来自 运行 的节假日报告?我只有 SQL Server Standard 2014,因此无法选择数据驱动的报告。

我通常做的是添加一个 run/don 而不是 运行 作为每个作业的第一步,然后有类似的东西:

IF EXISTS (SELECT HOLIDAYCD FROM CORE.dbo.BANKORGYEARMONTHDAY
           WHERE CAST(EFFDATE AS DATE) = CAST(GETDATE() AS DATE))
BEGIN
    EXEC('SELECT * FROM NonExistentTable')
END

然后这一步的"On Failure"选项就是"Quit the job reporting success"。

虽然这确实会导致作业重复,但它也让您有机会为每个作业是否应该实际执行引入不同的条件。

您需要用 BEGIN...END 块包装 ELSE 语句。

ELSE
BEGIN
    --On a normal business day, ensure they are enabled
    exec msdb..sp_update_job @job_name = 'CORE imports', @enabled = 1
    exec msdb..sp_update_job @job_name = '086BAE49-50CE-4B87-A8C2-A9386ABEE9D9', @enabled = 1
    exec msdb..sp_update_job @job_name = '82499D43-2884-4E16-A514-7B666F5AF095', @enabled = 1
    exec msdb..sp_update_job @job_name = '2581BD28-FA33-48C6-B9E1-7B91C432A2B0', @enabled = 1
END

没有它,只有第一条语句会被ELSE控制;任何后续语句都不会成为 IF...ELSE 流程的一部分,并且将始终执行,即在您的情况下始终设置为启用。