sql >> Databasteknik >  >> RDS >> Sqlserver

Lägg till ett jobbsteg till ett befintligt SQL Server Agent Job (T-SQL)

När du skapar ett SQL Server Agent-jobb med T-SQL använder du sp_add_jobstep lagrad procedur för att lägga till varje jobbsteg.

Om du någonsin behöver lägga till ett nytt steg i det jobbet kan du använda sp_add_jobstep igen för att lägga till det nya jobbsteget.

Men du kan också behöva ändra det befintliga steget, beroende på hur du vill att jobbet ska gå vidare genom stegen.

Exempel

I det här exemplet skapar vi ett jobb med ett jobbsteg, sedan använder vi sp_add_jobstep för att lägga till ett andra steg till det jobbet. Vi använder sedan sp_update_jobstep för att uppdatera det första jobbsteget så att det går vidare till det andra jobbsteget så snart det är klart.

Skapa jobbet

Skapa först jobbet med ett steg:

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

Bara för att vara tydlig var följande del biten som lade till steget:

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())';

Lägg till ett nytt jobbsteg

Vi kan nu använda sp_add_jobstep igen för att lägga till ett nytt steg i jobbet.

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())';

Detta lägger till ett andra steg till jobbet.

Uppdatera arbetsflödet

Om du vill att jobbet automatiskt ska gå från steg 1 till steg 2, måste du ange det i jobbsteg 1.

Standardåtgärden för alla jobbsteg är att avsluta jobbet med framgång så snart det lyckas. Om steget misslyckas är standardåtgärden att avsluta med misslyckande.

Så som vårt jobb ser ut för närvarande kommer jobbet att slutföras så snart steg 1 har slutförts (utan att köra steg 2), och historiken kommer att rapportera att jobbet kördes framgångsrikt.

Därför måste vi använda sp_update_jobstep för att uppdatera steg 1, så att det går vidare till steg 2 när det är klart.

Vi kan också specificera vad som ska göras om steg 1 misslyckas.

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

I det här fallet har jag specificerat att det ska gå vidare till nästa steg både om det lyckas och även om det misslyckas.

Värdena som du kan ange till @on_success_action och @on_fail_action är följande:

1 Avsluta med framgång. Detta är standard för @on_success_action .
2 Avsluta med misslyckande. Detta är standard för @on_fail_action .
3 Gå till nästa steg.
4 Gå till steg (ID). Det är här du anger ID för ett steg som du vill att jobbet ska gå vidare till.

Visa jobbstegen

Du kan använda sp_help_job för att få information om SQL Server Agent-jobben i systemet.

Du kan använda det med eller utan parametrar, men för att få detaljerna om jobbsteget måste du ange jobbets namn eller ID.

Vi kan använda den för att se båda jobbstegen som vi skapade för jobbet.

Så här:

EXEC sp_help_job 
	@job_name = 'SqlAgentTest';

Så här ser resultatet ut när du kör det i SSMS:

Här är ett exempel på koden när du använder ID:t:

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

När du använder ID:t kan du utelämna parameternamnet om du vill.

Exempel:

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

Du kan också använda sp_help_jobstep på samma sätt för att returnera bara jobbstegen (utan all annan info om jobbet). Detta accepterar jobbets namn eller ID, såväl som ett valfritt stegnamn eller ID.

Full syntax

Den fullständiga syntaxen för sp_add_jobstep går så här:

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' } ]

Se Microsofts dokumentation för sp_add_jobstep för en förklaring av varje parameter, såväl som de värden som var och en accepterar.

Den fullständiga syntaxen för sp_update_jobstep går så här:

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' }

Se Microsofts dokumentation för sp_update_jobstep för en förklaring av varje parameter, såväl som de värden som var och en accepterar.


  1. Varför avrundar SQL Server resultaten av att dividera två heltal?

  2. Hur du snabbar upp din SQL-server med hjälp av databasprestandaövervakning

  3. JSON_QUERY() vs JSON_VALUE() i SQL Server:Vad är skillnaden?

  4. Vänster och höger sammanfogar med hjälp av plustecknet (+) i Oracle