我有一个 SQL Server 代理作业,之前有两个步骤。今天,我必须集成第三步,很快我就需要集成第四步。
我想确保该步骤能够正确执行,但我不想执行整个作业。
前两个步骤需要相当多的时间来执行,并且在白天它们会占用我的用户所需的大量 SQL 资源。
有没有办法可以执行一个作业步骤而不是整个作业流程?
在 SSMS 中,如果我右键单击作业,则会有一个选项显示“在步骤中启动作业...”,除非我尝试该选项时,它会弹出一个对话框,似乎暗示整个作业已启动。我可以做什么来测试工作中的一个步骤?
提前致谢。
“在步骤开始作业”将在您指定的步骤开始作业。但是 - 如果您不想执行任何后续步骤 - 请务必调整步骤逻辑,以便在完成您开始的步骤后它将“退出报告成功”。
在 SSMS 中:
或者,如果您经常需要运行几个步骤。
将这些步骤放在一个单独的作业中,然后从另一个作业中启动一个作业来运行所有内容。使用
EXEC msdb.dbo.sp_start_job N'job_name'
您可以按需运行短期轻松作业,也可以按计划运行完整的长期作业
使用这个:
EXEC msdb.dbo.sp_start_job N'job_name' , 'step_name'
--如何只运行作业的一步
基本上我会保存工作中步骤的当前情况 - 特别是成功时做什么以及失败时做什么。
然后我更改它以相应地结束工作成功或失败。
这是脚本:
USE [msdb]
GO
declare @on_success_action int,
@on_fail_action int,
@run_the_job bit = 0
if object_id('tempdb..#the_only_step',N'U') is not null
drop table #the_only_step
create table #the_only_step(
step_id int,-- Unique identifier for the step.
step_name sysname,-- Name of the step in the job.
subsystem nvarchar(40),-- Subsystem in which to execute the step command.
command nvarchar(max),-- Command executed in the step.
flags int,-- A bitmask of values that control step behavior.
cmdexec_success_code int,-- For a CmdExec step, this is the process exit code of a successful command.
on_success_action tinyint,-- Action to take if the step succeeds:
--1 = Quit the job reporting success.
--2 = Quit the job reporting failure.
--3 = Go to the next step.
--4 = Go to step.
on_success_step_id int,-- If on_success_action is 4, this indicates the next step to execute.
on_fail_action tinyint,-- What to do if the step fails. Values are same as on_success_action.
on_fail_step_id int,-- If on_fail_action is 4, this indicates the next step to execute.
server varchar(100) null,-- Reserved.
database_name varchar(100) null,-- For a Transact-SQL step, this is the database in which the command executes.
database_user_name varchar(100) null,-- For a Transact-SQL step, this is the database user context in which the command executes.
retry_attempts int,-- Maximum number of times the command should be retried (if it is unsuccessful).
retry_interval int,-- Interval (in minutes) for any retry attempts.
os_run_priority int,-- Reserved.
output_file_name nvarchar(200),-- File to which command output should be written (Transact-SQL, CmdExec, and PowerShell steps only).
last_run_outcome int,-- Outcome of the step the last time it ran:
--0 = Failed
--1 = Succeeded
--2 = Retry
--3 = Canceled
--5 = Unknown
last_run_duration int,-- Duration (hhmmss) of the step the last time it ran.
last_run_retries int,-- Number of times the command was retried the last time the step ran.
last_run_date int,-- Date the step last started execution.
last_run_time int,-- Time the step last started execution.
proxy_id int
)
insert into #the_only_step
EXEC msdb.dbo.sp_help_jobstep
@job_name=N'SUPT_munichRE - after restore',
@step_id=2
--you can check if things are there as expected
select * from #the_only_step
--we want to change the step:
--after finished - success and after finished - failure - either way end the job
select @on_success_action= a.on_success_action,
@on_fail_action = a.on_fail_action
from #the_only_step a
EXEC msdb.dbo.sp_update_jobstep
@job_name=N'SUPT_munichRE - after restore',
@step_id=2 ,
@on_success_action=1,
@on_fail_action=2
if (@run_the_job = 1)
BEGIN
EXEC msdb.dbo.sp_start_job
@job_name=N'SUPT_munichRE - after restore',
@step_name = N'2'
PRINT 'job started'
END
--after it finishes running
--set the values back as they originally were
EXEC msdb.dbo.sp_update_jobstep
@job_name=N'SUPT_munichRE - after restore',
@step_id=2 ,
@on_success_action=@on_success_action,
@on_fail_action=@on_fail_action
现在另一个有趣的点是
开始工作后,如何等待完成后再继续?
答案在这里:
--INSERT EXEC 语句不能嵌套。 --http://stackoverflow.com/questions/3795263/errors-insert-exec-statement-cannot-be-nested-and-cannot-use-the-rollback-s
基本上,我使用该存储过程来运行作业,而不是上面脚本中的 msdb.dbo.sp_start_job 。
希望这有帮助 因为它对我来说非常有用!
转到作业属性并手动执行该步骤。例如,有一个作业有 16 个步骤,您想要运行第 12 个步骤,然后转到该作业属性并查看第 12 步到底做了什么。如果它在命令提示符下执行批处理文件,请手动执行。但这个逻辑并不能适用于所有情况。
USE [**DB_NAME**]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[**STEP_NAME**]
SELECT 'Return Value' = @return_value
GO