SQL Server 如何准确获取Job的调度时间

下面是三种获取Job调度时间的方法:

第一种:

 1 declare 
2 @jobid varchar(50),
3 @newjobid varchar(50)
4 select @jobid = replace(job_id, '-', '')
5 from msdb.dbo.sysjobs where name = 'create_snapshotjob'
6 select @jobid
7 set @newjobid = SUBSTRING(@jobid, 7, 2)+SUBSTRING(@jobid, 5, 2)+SUBSTRING(@jobid, 3, 2)+SUBSTRING(@jobid, 1, 2)
8 +SUBSTRING(@jobid, 11, 2)+SUBSTRING(@jobid, 9, 2)+SUBSTRING(@jobid, 15, 2)+SUBSTRING(@jobid, 13, 2)+SUBSTRING(@jobid, 17, 50)
9
10 select a.*, b.*
11 from sys.dm_exec_sessions a
12 inner join sys.dm_exec_requests b on b.session_id = a.session_id
13 where program_name like 'SQLAgent - TSQL JobStep (Job 0x'+@newjobid+'%'

第二种:

exec msdb.dbo.sp_help_job

第三种:

exec master.dbo.xp_sqlagent_enum_jobs 1, ''

根据执行的情况来观察第一和第二种方法应该是在SQL Server服务内部的状态获取,第一种方法是获得Job进程情况,而第二种未知。但通过观察第二种和第一种的表现是基本一样的。

 

 

上图是通过Job的执行过程中抓取的三种脚本出来的情况,我们可以看到

第一种方法可以抓到一个Job执行的进程信息。说明该Job正在执行,这里执行的是一个CREATE DATABASE进程。

第二种方法可以看到当前Job的current_execution_status 为 1 是正在执行,同时 current_execution_step显示执行步骤

第三种方法同第二种方法,显示running为1是执行状态,同时current step显示执行步骤

这可以说明三种方法都可以捕获到Job的执行情况,那么我们在使用中会应用哪中方法呢?

 


上面这图是Job执行快结束时捕获的,我们可以看到目前Job还在执行,但是第一和第二种方法中显示Job已经执行完成。而第三种方法可以看到JOB还在执行,但是Current step为0 说明没有步骤在执行。

 

从上面的分析我们可以得出,第一种方法和第二种方法应该可以获取到Job的执行步骤但是无法获取整个JOb的当前准确状态。而第三种方法可以获取Job的每个步骤及整个Job的所有状况。实际应用的时候可以根据情况来选择方法。

posted on 2011-11-08 10:00  trams  阅读(711)  评论(0编辑  收藏  举报