Chiamata a un processo di SQL Server all'interno di un altro processo


10

È possibile chiamare un processo di SQL Server per eseguirlo in un altro processo?

So che possiamo aggiungere tutti i passaggi del Lavoro 1 al Lavoro 2, ma preferisco non farlo. Innanzitutto il Job 2 è già abbastanza grande e in secondo luogo non sono riuscito a trovare un'opzione copia-incolla per copiare i passaggi tra i processi, quindi sarebbe necessario tempo per aggiungere i passaggi manualmente.

Ogni suggerimento è apprezzato.

Risposte:


7
  • Fare clic con il tasto destro del mouse sul lavoro di cui si desidera aggiungere i passaggi e selezionare "Script lavoro come-> Crea nella nuova finestra della query", nello script risultante cercare tutte le sezioni che hanno questo 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
  • Apri una nuova finestra di query ed esegui questo:
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

14

opzione 1

In Job2, creare un passaggio di lavoro di tipo TSQL Command. Nei contenuti, esegui il processo esistente ( sp_start_job )

EXECUTE msdb.dbo.sp_start_job 'Job1'

Verrà eseguito in modo asincrono, quindi dopo aver avviato chiama la procedura memorizzata, tornerà ed eseguirà il passaggio successivo nel lavoro. Non attenderà il completamento del processo avviato. Se il lavoro chiamato fallisce, non tornerà al lavoro invocante.

opzione 2

Fare clic con il tasto destro su Job1 e eseguire lo script nella nuova finestra della query. Ripetere l'operazione con Job2, quindi inserire i passaggi del processo da 1 a 2 come / dove necessario. Molto meno clic che ricreare la ruota e si spera meno soggetto a errori.


Grazie per la tua risposta. Sembra che dobbiamo optare per l'opzione 2. Non sono del tutto sicuro di averlo capito correttamente. Vuoi dire che dovrei creare gli script per entrambi i lavori e quindi aggiungere i passaggi di job2 alla fine di job1? È giusto?
Sky,

6

Dallo 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

Questo è stato utile per noi, dove dovevamo ritardare l'esecuzione di un secondo lavoro (che viene eseguito il giorno seguente) basato sull'esecuzione del primo lavoro a tarda sera.
James D,

Sto eseguendo un lavoro SYNC (giornaliero) e incrementale (orario) e questo mi ha aiutato a tenere un controllo sull'incrementale e aspettare fino a quando non è finito per eseguire la sincronizzazione.
snp.it
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.