Вызов задания SQL Server внутри другого задания

10

Можно ли вызвать задание SQL Server для запуска в другом задании?

Я знаю, что мы можем добавить все этапы задания 1 в задание 2, но я предпочитаю этого не делать. Во-первых, задание 2 уже довольно большое, а во-вторых, я не смог найти вариант копирования-вставки для копирования шагов между заданиями, поэтому добавление шагов вручную заняло бы много времени.

Любое предложение приветствуется.

Небо
источник

Ответы:

7
  • Щелкните правой кнопкой мыши на задании, шаги которого вы хотите добавить, и выберите «Задание сценария как -> Создать в новом окне запроса», в результирующем сценарии найдите все разделы, имеющие этот формат.
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'<stepname>', 
  @step_id=1, 
  @cmdexec_success_code=0, 
  @on_success_action=3, 
  @on_success_step_id=0, 
  @on_fail_action=2, 
  @on_fail_step_id=0, 
  @retry_attempts=0, 
  @retry_interval=0, 
  @os_run_priority=0, @subsystem=N'TSQL', 
  @command=N'<code>', 
  @database_name=N'', 
  @flags=0
  • Откройте новое окно запроса и запустите это:
DECLARE @jobId BINARY(16)
    SET @jobId = (SELECT job_id FROM msdb.dbo.sysjobs WHERE name = '<job name, to which you want to copy the steps>')

-- Followed by all the msdb.dbo.sp_add_jobstep from the script that scripted out in the earlier step

    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'<stepname>', 
      @step_id=1, 
      @cmdexec_success_code=0, 
      @on_success_action=3, 
      @on_success_step_id=0, 
      @on_fail_action=2, 
      @on_fail_step_id=0, 
      @retry_attempts=0, 
      @retry_interval=0, 
      @os_run_priority=0, @subsystem=N'TSQL', 
      @command=N'<code>', 
      @database_name=N'', 
      @flags=0
WrinkleFree
источник
14

Опция 1

В Job2 создайте шаг задания типа TSQL Command. В содержании, пусть он запускает существующее задание ( sp_start_job )

EXECUTE msdb.dbo.sp_start_job 'Job1'

Он будет работать асинхронно, поэтому после запуска хранимой процедуры он вернется и выполнит следующий шаг в задании. Он не будет ждать завершения начатой ​​работы. Если вызванное задание не выполнено, оно не будет возвращено к вызывающему заданию.

Вариант 2

Щелкните правой кнопкой мыши на Job1 и перейдите в новое окно запроса. Повторите это с Job2, а затем проделайте шаги задания с 1 на 2 по мере необходимости. Гораздо меньше щелчков, чем воссоздание колеса, и, надеюсь, меньше подвержено ошибкам.

billinkc
источник
Спасибо за ваш ответ. Похоже, нам нужно перейти к варианту 2. Я не совсем уверен, правильно ли я это понял. Ты имеешь в виду, что я должен создать сценарии для обоих заданий, а затем добавить шаги задания2 до конца задания1? Это правильно?
Небо
6

Из стека overflow (мафафу)

WAITFOR DELAY '00:00:02';
while exists (select * from msdb.dbo.sysjobs j 
                inner join msdb.dbo.sysjobactivity a on j.job_id = a.job_id 
                where name = 'Job 1' 
                and stop_execution_date is null and start_execution_date is not null)
begin
    PRINT 'Waiting...'
    WAITFOR DELAY '00:00:02';   
end
Крис Харланд
источник
Это было полезно для нас, когда нам нужно было отложить выполнение второй работы (которая запускается в начале следующего дня) на основе выполнения первой работы поздно вечером.
Джеймс Д.
Я выполняю задания SYNC (ежедневные) и инкрементные (ежечасные), и это помогло мне проверить инкрементный код и дождаться его завершения для запуска SYNC.
snp.it