【问题标题】:SQL Agent Job Not Running all the stepsSQL 代理作业未运行所有步骤
【发布时间】:2015-05-26 13:08:43
【问题描述】:

我有一个 SQL 代理作业,如果给定日期的另一个表中有 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

所以发生的事情是“核心导入”作业正在禁用,但 SSRS 作业都没有。有没有更好的方法来阻止报告在假期运行?我只有 SQL Server Standard 2014,所以不能选择数据驱动的报告。

【问题讨论】:

  • 您可能需要将第二组语句包装在 ELSE 之后的 BEGIN...END 块中。
  • @IanPreston 就是这样。谢谢你。如果您将其发布为答案,我会确保标记它。
  • 谢谢,添加为答案!

标签: sql-server reporting-services sql-agent-job


【解决方案1】:

您需要用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 流的一部分,并且将始终执行,即在您的情况下始终设置为启用。

【讨论】:

    【解决方案2】:

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

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

    然后此步骤的“失败时”选项是“退出作业报告成功”。

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

    【讨论】:

    • 这仅适用于少数工作,但是,我没有将所有 SSRS 工作都放在问题中。我正在尝试提出一种方法,在该方法中,我可以在一个步骤中添加我想停止运行的所有作业。然后我可以告诉人们在他们需要在假期停止运行的工作时在那里添加工作。我只是不明白为什么只有第一个 exec 正在运行,而不是其余的。
    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多