我有一个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
所发生的事情是' CORE进口'作业正在禁用,但没有SSRS作业。有没有更好的方法来阻止报告在假期运行?我只有SQL Server Standard 2014,所以不能选择数据驱动的报告。
答案 0 :(得分:2)
您需要使用ELSE
块包装BEGIN...END
语句。
即
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
流程的一部分,并且将始终执行,即在您的情况下始终设置为启用。
答案 1 :(得分:0)
我通常所做的是添加一个运行/不运行步骤作为每项工作的第一步,然后有类似的内容:
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"此步骤的选项是"退出作业报告成功"。
虽然这确实导致了跨作业的重复,但它也让您有机会为每个作业是否应该实际执行引入不同的条件。