Chamando um trabalho do SQL Server em outro trabalho

10

É possível chamar um trabalho do SQL Server para ser executado em outro trabalho?

Sei que podemos adicionar todas as etapas do trabalho 1 ao trabalho 2, mas prefiro não fazer isso. Primeiro, o trabalho 2 já é bastante grande e, segundo, não consegui encontrar uma opção de copiar e colar para copiar etapas entre tarefas, portanto, seria demorado adicionar as etapas manualmente.

Qualquer sugestão é apreciada.

Céu
fonte

Respostas:

7
  • Clique com o botão direito do mouse no trabalho cujas etapas você deseja adicionar e escolha "Trabalho de Script Como-> Criar na Nova Janela de Consulta". No script resultante, procure todas as seções que possuem este formato
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
  • Abra uma nova janela de consulta e execute:
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
Enrugamento
fonte
14

Opção 1

No Job2, crie uma etapa do trabalho do tipo Comando TSQL. No conteúdo, ele deve executar o trabalho existente ( sp_start_job )

EXECUTE msdb.dbo.sp_start_job 'Job1'

Isso será executado de forma assíncrona; portanto, após o início da chamada do procedimento armazenado, ele retornará e executará a próxima etapa do trabalho. Não aguardará a conclusão do trabalho iniciado. Se o trabalho chamado falhar, ele não retornará ao trabalho de chamada.

opção 2

Clique com o botão direito do mouse em Job1 e faça o script para a nova janela de consulta. Repita isso com o Job2 e, em seguida, passe as etapas do trabalho de 1 para 2, conforme necessário. Muito menos cliques do que recriar a roda e, com sorte, menos propensos a erros.

billinkc
fonte
Obrigado pela sua resposta. Parece que temos que optar pela opção 2. Não tenho muita certeza se entendi corretamente. Você quer dizer que devo criar os scripts para os dois trabalhos e acrescentar as etapas do trabalho2 ao final do trabalho1? Isso está certo?
Sky
6

Do stackoverflow (mafafu)

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
Chris Harland
fonte
Isso foi útil para nós, onde precisávamos atrasar a execução de um segundo trabalho (que é executado no dia seguinte) com base na execução do primeiro trabalho no final da noite.
James D
Estou executando um trabalho de SINCRONIZAÇÃO (Diariamente) e Incremental (por hora), e isso me ajudou a verificar o Incremento e aguardar até que ele termine para executar o SINCRONIZAÇÃO.
usar o seguinte comando