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

Erstellen eines mehrstufigen SQL Server-Agent-Auftrags (T-SQL)

In einem früheren Artikel über das Erstellen eines SQL Server-Agent-Jobs mit T-SQL habe ich gezeigt, wie man einen Job in einem einzigen Schritt erstellt.

In diesem Artikel zeige ich Ihnen, wie Sie einen Job mit mehreren Schritten erstellen.

Beispiel

Wenn Sie einen SQL Server-Agent-Auftrag mit T-SQL erstellen, müssen Sie mehrere gespeicherte Prozeduren verwenden. Dies liegt daran, dass jeder Teil unabhängig von den anderen behandelt wird. Beispiel:sp_add_job Prozedur erstellt den Job und der sp_add_jobstep Prozedur erstellt einen Schritt in diesem Job.

Wenn Sie einen Job erstellen, der mehr als einen Schritt hat, müssen Sie sp_add_jobstep aufrufen mehrmals, wobei jeder Aufruf einen anderen Schritt definiert.

Wenn Sie möchten, dass der Job die Schritte durchläuft (und den Job nicht nach dem ersten Schritt beendet), müssen Sie dies beim Aufrufen der Prozedur angeben.

Hier ist ein Beispiel, das all das tut.

USE msdb;  
GO  
EXEC sp_add_job  
    @job_name = N'SqlAgentTest',
    @description = N'Backup the Movies database.',
    @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())',  
    @on_success_action = 3;
GO
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())',  
    @on_success_action = 1;
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',  
    @server_name = N'(LOCAL)';
GO

Dieser Code erstellt einen Job mit zwei Jobschritten. Es erstellt auch einen neuen Zeitplan, hängt diesen Job an den Zeitplan an und richtet den Job dann auf den lokalen Server aus.

Der Teil, der die Jobschritte erstellt, ist dieser:

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())',  
    @on_success_action = 3;
GO
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())',  
    @on_success_action = 1;
GO

Beim ersten Aufruf ist der Teil, der @on_success_action = 3 lautet ist es, was den Job mit dem nächsten Schritt fortsetzt.

Der Standardwert ist 1 , was bedeutet, dass der Job nach Abschluss des ersten Schritts beendet wird (was wir im zweiten Schritt angegeben haben). Wenn wir also nicht @on_success_action = 3 eingefügt hätten Teil im ersten Schritt, würde der Job beendet, ohne mit dem nächsten Schritt fortzufahren.

Sie können auch @on_fail_action angeben , der angibt, was passieren wird, wenn dieser Schritt 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.