Kev*_*ild 10 sql sql-server sql-server-2008 sql-agent-job
情景
某些SQL代理作业计划在一天中每隔几分钟运行一次.
在合法的时间里,它会错过下一个时间表,因为它仍然按照之前的时间表运行.
每隔一段时间,一份工作可能会"挂起".这不会导致失败(因为作业尚未停止).发生这种情况时,可以手动停止作业,并在下次运行时正常工作.它的设计目的是从它停止的地方回来.
什么是最有效的方式......?
我想要一种方法来确定名为"JobX"的SQL代理作业当前正在运行多长时间(以秒为单位).如果它当前没有运行,我们可以返回零.
这样,如果工作已经超过某个阈值的时间,我可以停止工作.
我认为xp_sqlagent_enum_jobs和sysjobhistory的组合可以使用,但我是否有更好的解决方案在那里好奇...并希望能够从其余的你已经运行到和周围工作的障碍受益.
Zhe*_*nny 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
)
Run Code Online (Sandbox Code Playgroud)
这是一种更通用的检查,取决于系统表.如果您更喜欢自定义路由,则可以将作业插入到您创建的作业日志表中.