Sql 长期运行作业

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

我不知道发生了什么事?我仍然收到一封电子邮件,即使作业在晚上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,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
会导致查询将开始日期与结束日期(如果有)进行比较,或者将开始日期与当前时间(如果作业尚未完成)进行比较。。。