Wywoływanie zadania SQL Server w ramach innego zadania

11

Czy można wywołać zadanie programu SQL Server w celu uruchomienia go w ramach innego zadania?

Wiem, że możemy dodać wszystkie etapy zadania 1 do zadania 2, ale wolę tego nie robić. Po pierwsze, zadanie 2 jest już dość duże, a po drugie nie mogłem znaleźć opcji kopiuj-wklej, aby skopiować kroki między zadaniami, więc ręczne dodanie kroków byłoby czasochłonne.

Wszelkie sugestie są mile widziane.

Niebo
źródło

Odpowiedzi:

7
  • Kliknij prawym przyciskiem myszy zadanie, którego kroki chcesz dodać, i wybierz „Zadanie skryptu jako-> Utwórz w nowym oknie zapytania”, w wynikowym skrypcie wyszukaj wszystkie sekcje, które mają ten format
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
  • Otwórz nowe okno zapytania i uruchom to:
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
Bez zmarszczek
źródło
15

opcja 1

W Job2 utwórz krok zadania typu TSQL Command. W treści uruchom bieżące zadanie ( sp_start_job )

EXECUTE msdb.dbo.sp_start_job 'Job1'

To będzie działać asynchronicznie, więc po uruchomieniu wywoła procedurę przechowywaną, powróci i wykona następny krok w zadaniu. Nie będzie czekać na zakończenie rozpoczętego zadania. Jeśli wywoływane zadanie nie powiedzie się, nie przeniknie ponownie do zadania wywołującego.

Opcja 2

Kliknij prawym przyciskiem myszy Job1 i skrypt do nowego okna zapytania. Powtórz to z Job2, a następnie przewiń kroki zadania od 1 do 2, w razie potrzeby. Znacznie mniej kliknięć niż odtwarzanie koła i, mam nadzieję, mniej podatny na błędy.

billinkc
źródło
Dzięki za odpowiedź. Wygląda na to, że musimy wybrać opcję 2. Nie jestem jednak pewien, czy dobrze to zrozumiałem. Czy masz na myśli, że powinienem utworzyć skrypty dla obu zadań, a następnie dołączyć kroki zadania 2 do końca zadania 1? Czy to prawda?
Sky
6

From 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
źródło
Przydało nam się to, gdy musieliśmy opóźnić wykonanie drugiego zlecenia (które działa wcześnie następnego dnia) w oparciu o wykonanie pierwszego zlecenia późnym wieczorem.
James D.
Prowadzę zadania SYNC (codziennie) i przyrostowe (co godzinę), co pomogło mi zachować kontrolę nad przyrostem i poczekać, aż skończy się uruchamianie SYNC.
snp.it