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.