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