2012-08-01 69 views
1

我不确定发生了什么事?尽管工作在晚上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 = '[email protected]', 
       @subject = 'T-SQL Query Result', 
       @body = 'The Nightly_Job has been running 7 

回答

2

与您的查询的问题是,它只检查了多久已经过去了,因为作业开始...它没有考虑到当作业完成。

如果在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) 
+0

谢谢你这么多!这完全奏效! – 2012-08-01 18:40:24

+0

非常感谢你!这完全奏效了!你如何使用IS NULL THOUGH?自从工作停止以后,不应该存在非空值吗? – 2012-08-01 18:49:42

+0

我明白!我需要排除或将工作归为空,因为他们还没有完成... – 2012-08-01 18:51:25