Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Hinzufügen eines Auftragsschritts zu einem vorhandenen SQL Server-Agent-Auftrag (T-SQL)

Wenn Sie einen SQL Server-Agent-Auftrag mit T-SQL erstellen, verwenden Sie den sp_add_jobstep gespeicherte Prozedur, um jeden Jobschritt hinzuzufügen.

Wenn Sie jemals einen neuen Schritt zu diesem Job hinzufügen müssen, können Sie sp_add_jobstep verwenden erneut, um den neuen Auftragsschritt hinzuzufügen.

Möglicherweise müssen Sie jedoch auch den vorhandenen Schritt ändern, je nachdem, wie der Job die Schritte durchlaufen soll.

Beispiel

In diesem Beispiel erstellen wir einen Job mit einem Jobschritt, dann verwenden wir sp_add_jobstep um diesem Job einen zweiten Schritt hinzuzufügen. Wir verwenden dann sp_update_jobstep um den ersten Job-Schritt zu aktualisieren, sodass er sofort nach Abschluss mit dem zweiten Job-Schritt fortfährt.

Job erstellen

Erstellen Sie zunächst den Job in einem Schritt:

USE msdb;  
GO  
EXEC sp_add_job  
    @job_name = N'SqlAgentTest',
    @description = N'Insert data.',
    @category_name = 'Database Maintenance';
GO  
EXEC sp_add_jobstep  
    @job_name = N'SqlAgentTest',  
    @step_name = N'Insert data for step 1',  
    @subsystem = N'TSQL',  
    @command = N'USE TestDB; INSERT INTO SqlAgentJobs VALUES (''SqlAgentTest'', 1, SYSDATETIME())';
GO
EXEC sp_add_schedule 
    @schedule_name = N'Run_Sat_6AM',
    @freq_type = 8,
    @freq_interval = 64,
    @freq_recurrence_factor = 1,
    @active_start_time = 060000;
GO  
EXEC sp_attach_schedule  
   @job_name = N'SqlAgentTest',  
   @schedule_name = N'Run_Sat_6AM';
GO  
EXEC sp_add_jobserver  
    @job_name = N'SqlAgentTest';
GO

Nur um es klarzustellen, der folgende Teil war das Bit, das den Schritt hinzufügte:

EXEC sp_add_jobstep  
    @job_name = N'SqlAgentTest',  
    @step_name = N'Insert data for step 1',  
    @subsystem = N'TSQL',  
    @command = N'USE TestDB; INSERT INTO SqlAgentJobs VALUES (''SqlAgentTest'', 1, SYSDATETIME())';

Neuen Jobschritt hinzufügen

Wir können jetzt sp_add_jobstep verwenden erneut, um dem Job einen neuen Schritt hinzuzufügen.

USE msdb;
EXEC sp_add_jobstep  
    @job_name = N'SqlAgentTest',  
    @step_name = N'Insert data for step 2',  
    @subsystem = N'TSQL',  
    @command = N'USE TestDB; INSERT INTO SqlAgentJobs VALUES (''SqlAgentTest'', 2, SYSDATETIME())';

Dies fügt dem Job einen zweiten Schritt hinzu.

Aktualisieren Sie den Arbeitsablauf

Wenn Sie möchten, dass der Job automatisch von Schritt 1 zu Schritt 2 fortschreitet, müssen Sie dies in Jobschritt 1 angeben.

Die Standardaktion für jeden Jobschritt besteht darin, den Job erfolgreich zu beenden, sobald er erfolgreich ist. Wenn der Schritt fehlschlägt, ist die Standardaktion das Beenden mit Fehler.

So wie unser Job derzeit aussieht, wird der Job beendet, sobald Schritt 1 abgeschlossen ist (ohne Schritt 2 auszuführen), und der Verlauf meldet, dass der Job erfolgreich ausgeführt wurde.

Daher müssen wir sp_update_jobstep verwenden um Schritt 1 zu aktualisieren, sodass nach erfolgreichem Abschluss mit Schritt 2 fortgefahren wird.

Wir können auch angeben, was zu tun ist, wenn Schritt 1 fehlschlägt.

USE msdb;
EXEC sp_update_jobstep  
    @job_name = N'SqlAgentTest',  
    @step_id = 1,  
    @on_success_action = 3,  
    @on_fail_action = 3;

In diesem Fall habe ich angegeben, dass es zum nächsten Schritt übergehen soll, sowohl wenn es erfolgreich ist, als auch wenn es fehlschlägt.

Die Werte, die Sie für @on_success_action bereitstellen können und @on_fail_action lauten wie folgt:

1 Mit Erfolg aufhören. Dies ist die Standardeinstellung für @on_success_action .
2 Mit Fehler beenden. Dies ist die Standardeinstellung für @on_fail_action .
3 Weiter zum nächsten Schritt.
4 Gehen Sie zu Schritt (ID). Hier geben Sie die ID eines Schritts an, zu dem der Job fortschreiten soll.

Auftragsschritte anzeigen

Sie können sp_help_job verwenden um Informationen über die SQL Server Agent-Jobs im System zu erhalten.

Sie können es mit oder ohne Parameter verwenden, aber um die Jobschrittdetails zu erhalten, müssen Sie den Jobnamen oder die ID angeben.

Wir können es verwenden, um beide Jobschritte anzuzeigen, die wir für den Job erstellt haben.

So:

EXEC sp_help_job 
	@job_name = 'SqlAgentTest';

So sieht das Ergebnis aus, wenn es in SSMS ausgeführt wird:

Hier ist ein Beispiel für den Code bei Verwendung der ID:

EXEC sp_help_job 
	@job_id = '343D9F2A-070A-4367-BF69-4248FFF57D70';

Wenn Sie die ID verwenden, können Sie den Parameternamen weglassen, wenn Sie möchten.

Beispiel:

EXEC sp_help_job '343D9F2A-070A-4367-BF69-4248FFF57D70';

Sie können auch sp_help_jobstep verwenden auf die gleiche Weise, um nur die Jobschritte zurückzugeben (ohne alle anderen Informationen über den Job). Dies akzeptiert den Jobnamen oder die ID sowie einen optionalen Schrittnamen oder eine ID.

Vollständige Syntax

Die vollständige Syntax von sp_add_jobstep geht so:

sp_add_jobstep [ @job_id = ] job_id | [ @job_name = ] 'job_name'
     [ , [ @step_id = ] step_id ]
     { , [ @step_name = ] 'step_name' }
     [ , [ @subsystem = ] 'subsystem' ]
     [ , [ @command = ] 'command' ]
     [ , [ @additional_parameters = ] 'parameters' ]
          [ , [ @cmdexec_success_code = ] code ]
     [ , [ @on_success_action = ] success_action ]
          [ , [ @on_success_step_id = ] success_step_id ]
          [ , [ @on_fail_action = ] fail_action ]
          [ , [ @on_fail_step_id = ] fail_step_id ]
     [ , [ @server = ] 'server' ]
     [ , [ @database_name = ] 'database' ]
     [ , [ @database_user_name = ] 'user' ]
     [ , [ @retry_attempts = ] retry_attempts ]
     [ , [ @retry_interval = ] retry_interval ]
     [ , [ @os_run_priority = ] run_priority ]
     [ , [ @output_file_name = ] 'file_name' ]
     [ , [ @flags = ] flags ]
     [ , { [ @proxy_id = ] proxy_id
         | [ @proxy_name = ] 'proxy_name' } ]

Siehe die Microsoft-Dokumentation für sp_add_jobstep für eine Erklärung jedes Parameters sowie der Werte, die jeder akzeptiert.

Die vollständige Syntax von sp_update_jobstep geht so:

sp_update_jobstep   
     {   [@job_id =] job_id   
       | [@job_name =] 'job_name' } ,  
     [@step_id =] step_id  
     [ , [@step_name =] 'step_name' ]  
     [ , [@subsystem =] 'subsystem' ]   
     [ , [@command =] 'command' ]  
     [ , [@additional_parameters =] 'parameters' ]  
     [ , [@cmdexec_success_code =] success_code ]  
     [ , [@on_success_action =] success_action ]   
     [ , [@on_success_step_id =] success_step_id ]  
     [ , [@on_fail_action =] fail_action ]   
     [ , [@on_fail_step_id =] fail_step_id ]  
     [ , [@server =] 'server' ]   
     [ , [@database_name =] 'database' ]  
     [ , [@database_user_name =] 'user' ]   
     [ , [@retry_attempts =] retry_attempts ]  
     [ , [@retry_interval =] retry_interval ]   
     [ , [@os_run_priority =] run_priority ]  
     [ , [@output_file_name =] 'file_name' ]   
     [ , [@flags =] flags ]  
     [ ,  {   [ @proxy_id = ] proxy_id   
            | [ @proxy_name = ] 'proxy_name' }

Siehe die Microsoft-Dokumentation für sp_update_jobstep für eine Erläuterung jedes Parameters sowie der Werte, die jeder akzeptiert.