情景
某些SQL代理作业计划在一天中每隔几分钟运行一次。
有合法的时间它会错过下一个时间表,因为它仍然按照之前的时间表运行。
每隔一段时间,工作就会“挂起”。这不会导致失败(因为作业尚未停止)。发生这种情况时,可以手动停止作业,并在下次运行时正常工作。它旨在从中断的地方回过来。
什么是最有效的方法......?
我想要一种方法来确定名为“JobX”的SQL代理作业当前正在运行多长时间(以秒为单位)。如果它当前没有运行,我们可以返回零。
这样,如果工作已经超过一定的阈值,我可以停止工作。
我认为可以使用xp_sqlagent_enum_jobs和sysjobhistory的组合,但我很好奇是否有更好的解决方案......并且可以从其他人已经遇到并解决的障碍中受益。
答案 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