Sql 长期运行作业
我不知道发生了什么事?我仍然收到一封电子邮件,即使作业在晚上11:50停止运行,这显然少于7个小时,因为它是在昨晚7点开始的。如果作业运行超过7个小时,应该给我发电子邮件,因为某些原因昨天它在测试中工作,但今天它没有。有什么想法吗Sql 长期运行作业,sql,tsql,Sql,Tsql,我不知道发生了什么事?我仍然收到一封电子邮件,即使作业在晚上11:50停止运行,这显然少于7个小时,因为它是在昨晚7点开始的。如果作业运行超过7个小时,应该给我发电子邮件,因为某些原因昨天它在测试中工作,但今天它没有。有什么想法吗 SELECT * FROM msdb..sysjobactivity aj JOIN msdb..sysjobs sj on sj.job_id = aj.job_id WHERE DATEDIFF(HOUR,aj.start_execution_date,GetDa
SELECT *
FROM msdb..sysjobactivity aj
JOIN msdb..sysjobs sj on sj.job_id = aj.job_id
WHERE DATEDIFF(HOUR,aj.start_execution_date,GetDate())> 7
AND aj.start_execution_date IS NOT NULL
AND sj.name = 'Nightly_Job'
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)
if @@ROWCOUNT > 0
BEGIN
USE msdb
EXEC sp_send_dbmail
@profile_name = 'DB_Mail',
@recipients = 'xxx@yyy.com',
@subject = 'T-SQL Query Result',
@body = 'The Nightly_Job has been running 7
您的查询的问题是,它只检查作业启动后经过了多长时间。。。它不考虑作业何时完成 如果在7小时内没有其他作业执行,则将查询限制为最近一次运行的检查不会排除以前完成的作业。。。然后,查询返回7个多小时前启动的作业,但在本例中,该作业在4小时内完成 要修复查询以排除已完成的作业,请按如下方式修改查询:
SELECT *
FROM
msdb..sysjobactivity aj
JOIN msdb..sysjobs sj on sj.job_id = aj.job_id
WHERE
DATEDIFF(HOUR, aj.start_execution_date,
ISNULL(aj.stop_execution_date, GetDate()) )> 7
AND sj.name = 'Nightly_Job'
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)
非常感谢你!那完全奏效了!但是,您如何使用IS NULL?既然作业已经停止,那么这里不应该有一个非空值吗?我理解!我需要排除这些作业,或者让它们为空,因为它们是尚未完成的作业…@Sputnicktheproducer不客气。我想您已经知道了,但是
ISNULL
会导致查询将开始日期与结束日期(如果有)进行比较,或者将开始日期与当前时间(如果作业尚未完成)进行比较。。。