SQL代理作业:确定它运行的时间

时间:2012-05-23 19:30:01

标签: sql sql-server sql-server-2008 sql-agent-job

情景

某些SQL代理作业计划在一天中每隔几分钟运行一次。

有合法的时间它会错过下一个时间表,因为它仍然按照之前的时间表运行。

每隔一段时间,工作就会“挂起”。这不会导致失败(因为作业尚未停止)。发生这种情况时,可以手动停止作业,并在下次运行时正常工作。它旨在从中断的地方回过来。

什么是最有效的方法......?

我想要一种方法来确定名为“JobX”的SQL代理作业当前正在运行多长时间(以秒为单位)。如果它当前没有运行,我们可以返回零。

这样,如果工作已经超过一定的阈值,我可以停止工作。

我认为可以使用xp_sqlagent_enum_jobs和sysjobhistory的组合,但我很好奇是否有更好的解决方案......并且可以从其他人已经遇到并解决的障碍中受益。

3 个答案:

答案 0 :(得分:20)

此解决方案可行:

SELECT DATEDIFF(SECOND,aj.start_execution_date,GetDate()) AS Seconds
FROM msdb..sysjobactivity aj
JOIN msdb..sysjobs sj on sj.job_id = aj.job_id
WHERE aj.stop_execution_date IS NULL -- job hasn't stopped running
AND aj.start_execution_date IS NOT NULL -- job is currently running
AND sj.name = 'JobX'
and not exists( -- make sure this is the most recent run
    select 1
    from msdb..sysjobactivity new
    where new.job_id = aj.job_id
    and new.start_execution_date > aj.start_execution_date
)

这是一种更通用的检查,取决于系统表。如果您更喜欢自定义路由,则可以将作业插入到您创建的作业日志表中。

答案 1 :(得分:1)

/**** FOR CURRENTLY RUNNING JOBS ****/
SELECT j.name AS Job_Name,DATEDIFF(ss,a.start_execution_date ,GETDATE ())   
FROM msdb.dbo.sysjobactivity a INNER JOIN msdb.dbo.sysjobs j 
ON a.job_id =j.job_id
WHERE CONVERT(DATE,a.start_execution_date )=CONVERT(DATE,GETDATE ())
AND a.stop_execution_date IS NULL


/*This code will give u the Name of currently running jobs and for how much time it is running & after that u can add filters to it as u wish*/
/*Thanks in advance*/

答案 2 :(得分:0)

您手动执行的操作听起来像是一个叫做“看门狗”循环的内容"。基本上,一个SQL作业启动和/或监视代理作业,如果需要可以杀死它们。

The code below was taken from here,并且应该有所帮助,如果他们已经运行很长一段时间,则无需手动监控和终止工作:

   var1(t-2)  var2(t-2)  var1(t-1)  var2(t-1)  var2(t)
2        1.5       -0.8        0.9       -0.5     -0.2
3        0.9       -0.5       -0.1       -0.2      0.2
4       -0.1       -0.2       -0.3        0.2      0.4
5       -0.3        0.2       -0.7        0.4      0.6
6       -0.7        0.4        0.2        0.6      0.7