Aufrufen eines SQL Server-Jobs innerhalb eines anderen Jobs

10

Ist es möglich, einen SQL Server-Job aufzurufen, um ihn in einem anderen Job auszuführen?

Ich weiß, dass wir alle Schritte von Job 1 zu Job 2 hinzufügen können, aber ich ziehe es vor, das nicht zu tun. Erstens ist Job 2 bereits ziemlich groß und zweitens konnte ich keine Option zum Kopieren und Einfügen finden, um Schritte zwischen Jobs zu kopieren. Daher wäre es zeitaufwändig, die Schritte manuell hinzuzufügen.

Jeder Vorschlag wird geschätzt.

Himmel
quelle

Antworten:

7
  • Klicken Sie mit der rechten Maustaste auf den Job, dessen Schritte Sie hinzufügen möchten, und wählen Sie "Skriptjob als-> In neues Abfragefenster erstellen". Suchen Sie im resultierenden Skript nach allen Abschnitten, die dieses Format haben
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
  • Öffnen Sie ein neues Abfragefenster und führen Sie Folgendes aus:
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
Knitterfrei
quelle
14

Option 1

Erstellen Sie in Job2 einen Jobschritt vom Typ TSQL Command. Lassen Sie im Inhalt den vorhandenen Job ausführen ( sp_start_job )

EXECUTE msdb.dbo.sp_start_job 'Job1'

Das wird asynchron ausgeführt. Nach dem Start ruft die gespeicherte Prozedur auf und führt den nächsten Schritt im Job aus. Es wird nicht warten, bis der gestartete Job abgeschlossen ist. Wenn der aufgerufene Job fehlschlägt, wird er nicht zum aufrufenden Job zurückgesickert.

Option 2

Klicken Sie mit der rechten Maustaste auf Job1 und schreiben Sie ein Skript für ein neues Abfragefenster. Wiederholen Sie dies mit Job2 und führen Sie die Jobschritte nach Bedarf von 1 nach 2 ein. Weit weniger klicken als das Rad neu erstellen und hoffentlich weniger fehleranfällig.

billinkc
quelle
Danke für deine Antwort. Es scheint, wir müssen uns für Option 2 entscheiden. Ich bin mir nicht ganz sicher, ob ich es richtig verstanden habe. Meinen Sie damit, ich sollte die Skripte für beide Jobs erstellen und dann die Schritte von Job2 an das Ende von Job1 anhängen? Ist das richtig?
Himmel
6

Vom Stapelüberlauf (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
quelle
Dies war nützlich für uns, da wir die Ausführung eines zweiten Jobs (der am frühen folgenden Tag ausgeführt wird) aufgrund der Ausführung des ersten Jobs am späten Abend verzögern mussten.
James D
Ich führe einen SYNC-Job (täglich) und einen inkrementellen Job (stündlich) aus. Dies hat mir geholfen, den inkrementellen Job zu überprüfen und zu warten, bis der SYNC ausgeführt ist.
Snp.it