Задание агента SQL не выполняет все шаги

У меня есть задание агента 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, поэтому отчеты на основе данных не подходят.


person BigDevJames    schedule 26.05.2015    source источник
comment
Возможно, вам потребуется заключить второй набор операторов после ELSE в блок BEGIN...END.   -  person Ian Preston    schedule 26.05.2015
comment
@IanPreston Вот оно. Спасибо. Если вы опубликуете это как ответ, я обязательно отмечу это.   -  person BigDevJames    schedule 26.05.2015
comment
Спасибо, добавлено как ответ!   -  person Ian Preston    schedule 26.05.2015


Ответы (2)


Вам нужно обернуть операторы ELSE блоком BEGIN...END.

i.e.

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 и всегда будут выполняться, т.е. в вашем случае всегда включены.

person Ian Preston    schedule 26.05.2015

Обычно я добавляю шаг запуска/не запуска в качестве первого шага каждого задания, а затем добавляю что-то вроде:

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

А затем параметр «При сбое» для этого шага - «Выйти из задания, сообщая об успехе».

Хотя это и приводит к повторению заданий, это также дает вам возможность ввести различные условия того, должно ли каждое задание выполняться на самом деле.

person Damien_The_Unbeliever    schedule 26.05.2015
comment
Это сработает только для нескольких заданий, однако я не задал вопрос обо всех заданиях SSRS. Я пытаюсь придумать метод, в котором за один шаг я могу добавить все задания, которые я хочу остановить. Затем я могу сказать людям, чтобы они добавляли туда вакансии, когда им нужны те, которые перестают работать в праздники. Я просто не понимаю, почему работает только первый exec, а остальные нет. - person BigDevJames; 26.05.2015