用于获取作业步骤状态的SQL查询,如" Activity Monitor"

时间:2017-04-19 05:33:47

标签: sql sql-server

目前我正在研究一个SQL查询,以便在"活动监视器"中获取SQL作业的最后状态(例如)。 SQL服务器。这意味着我想显示上次执行SQL作业的每个作业步骤的最后状态:

在SQL作业当前正在运行的情况下,SQL查询的结果应如下所示:

enter image description here

如果SQL作业当前未运行,则SQL查询的结果应如下所示:

enter image description here

我使用sysjobs,sysjobhistory和sysjobactivity等不同的sys表播放了arround,但我没有把这些不同的表放在一起。我在网上发现的一切都不符合我的要求。你有没有人有过这样的要求?非常欢迎任何帮助!

1 个答案:

答案 0 :(得分:0)

附上我当前的SQL代码(将参数名称更改为您的作业名称)。当作业完成后,它可以正常工作(对我来说)但是工作当前正在运行,一些步骤已经完成,而其他步骤并非我无法找到解决方案:

DECLARE @Name NVARCHAR(MAX) SET @Name = 'Test'

--Get job ID = 'DA232252-D704-4ABA-8C95-0236C17A9715' DECLARE @JOB_ID NVARCHAR(MAX) select @JOB_ID=job_ID FROM msdb.dbo.sysjobs where name = @Name

--Get amount of job steps = 2 -1 DECLARE @COUNT_JOB_STEPS INT select @COUNT_JOB_STEPS=Count(job_ID) FROM msdb.dbo.sysjobsteps where job_ID = @JOB_ID SET @COUNT_JOB_STEPS = @COUNT_JOB_STEPS -1

--Check if job is currently running DECLARE @job_history_ID__END INT select @job_history_ID__END=job_history_ID FROM msdb.dbo.sysjobactivity where job_ID = @JOB_ID

if @job_history_ID__END is NULL Begin --Running select 'running'

End

else Begin --Not running -> Take history table

--we do not need "Job outcome" step set @job_history_ID__END = @job_history_ID__END - 1 --Build job_history_ID range DECLARE @job_history_ID__START INT set @job_history_ID__START= @job_history_ID__END - @COUNT_JOB_STEPS --Build final layout select js.job_ID, js.step_ID, js.step_name,'Finished' as Status, started = convert( datetime,convert(varchar, jh.run_date/10000)+'/'+convert(varchar, jh.run_date%1000/100)+'/'+convert(varchar, jh.run_date%100)+' '+convert(varchar, jh.run_time/10000)+':'+convert(varchar, jh.run_time%10000/100)+':'+convert(varchar, jh.run_time%100)+'.000' ), ended = convert( datetime,convert(varchar, jh.run_date/10000)+'/'+convert(varchar, jh.run_date%1000/100)+'/'+convert(varchar, jh.run_date%100)+' '+convert(varchar, jh.run_time/10000)+':'+convert(varchar, jh.run_time%10000/100)+':'+convert(varchar, jh.run_time%100)+'.000' )+stuff(stuff(replace(str(run_duration,6,0),' ','0'),3,0,':'),6,0,':') FROM msdb.dbo.sysjobsteps as js join msdb.dbo.sysjobhistory as jh on jh.job_ID = @JOB_ID and jh.instance_ID between @job_history_ID__START and @job_history_ID__END and jh.step_id = js.step_ID where js.job_ID = @JOB_ID End

此外,存储过程不是我搜索的最终结果。 SQL查询会更好。