Sql server SQL Server代理中是否有一种机制,可以在作业未在截止时间前完成时发送警报通知?

Sql server SQL Server代理中是否有一种机制,可以在作业未在截止时间前完成时发送警报通知?,sql-server,sql-server-agent,Sql Server,Sql Server Agent,一项工作通常在一小时内完成。但有时,它需要更长的时间或卡住。如果作业未在1小时内完成,是否有方法在SQL Server Agent中配置通知?默认情况下,SQL Server Agent没有此机制。请从作业开始时间起1小时后再创建一个作业,您希望监视和查询系统作业的完成状态。默认情况下,SQL Server Agent没有此机制机制..再创建一个作业,该作业从您希望监视和查询sys jobs以获取已完成状态的作业开始一小时后启动此时,我可以通过创建另一个监视作业并为您的作业调用以下查询来解决此问

一项工作通常在一小时内完成。但有时,它需要更长的时间或卡住。如果作业未在1小时内完成,是否有方法在SQL Server Agent中配置通知?

默认情况下,SQL Server Agent没有此机制。请从作业开始时间起1小时后再创建一个作业,您希望监视和查询系统作业的完成状态。默认情况下,SQL Server Agent没有此机制机制..再创建一个作业,该作业从您希望监视和查询sys jobs以获取已完成状态的作业开始一小时后启动

此时,我可以通过创建另一个监视作业并为您的作业调用以下查询来解决此问题,如果开始时间和停止时间之间的差异大于60分钟,则通过电子邮件通知

SELECT 
    j.job_id AS 'JobId',
    name AS 'JobName',
    start_execution_date AS 'StartTime',
    stop_execution_date AS 'StopTime',
    avgruntimeonsucceed,
    DATEDIFF(s,start_execution_date,GETDATE()) AS 'CurrentRunTime',
    CASE WHEN stop_execution_date IS NULL THEN 
            DATEDIFF(ss,start_execution_date,stop_execution_date) ELSE 0 END 'ActualRunTime',
    CASE 
        WHEN stop_execution_date IS NULL THEN 'JobRunning'
        WHEN DATEDIFF(ss,start_execution_date,stop_execution_date) 
            > (AvgRunTimeOnSucceed + AvgRunTimeOnSucceed * .05) THEN 'LongRunning-History'
        ELSE 'NormalRunning-History'
    END 'JobRun',
    CASE 
        WHEN stop_execution_date IS NULL THEN
            CASE WHEN DATEDIFF(ss,start_execution_date,GETDATE())
                        > (AvgRunTimeOnSucceed + AvgRunTimeOnSucceed * .05) THEN 'LongRunning-NOW'
            ELSE 'NormalRunning-NOW'
        END
        ELSE 'JobAlreadyDone'
    END AS 'JobRunning'
 FROM msdb.dbo.sysjobactivity ja
    INNER JOIN msdb.dbo.sysjobs j ON ja.job_id = j.job_id
INNER JOIN (
    SELECT job_id,
    AVG
    ((run_duration/10000 * 3600) + ((run_duration%10000)/100*60) + (run_duration%10000)%100)
    +
    STDEV
    ((run_duration/10000 * 3600) + ((run_duration%10000)/100*60) + (run_duration%10000)%100) AS 'AvgRuntimeOnSucceed'
     FROM msdb.dbo.sysjobhistory
    WHERE step_id = 0 AND run_status = 1
    GROUP BY job_id) art 
    ON j.job_id = art.job_id
WHERE 
(stop_execution_date IS NULL) OR 
    (DATEDIFF(ss,start_execution_date,stop_execution_date) > 60
    AND 
    CAST(LEFT(start_execution_date,11) AS DATETIME) = CAST(LEFT(GETDATE(),11) AS DATETIME))
ORDER BY start_execution_date DESC

此时,我可以通过创建另一个监视器作业并为您的作业调用其中的以下查询来解决此问题,如果starttime和stoptime之间的差异大于60分钟,则您可以通过电子邮件通知

SELECT 
    j.job_id AS 'JobId',
    name AS 'JobName',
    start_execution_date AS 'StartTime',
    stop_execution_date AS 'StopTime',
    avgruntimeonsucceed,
    DATEDIFF(s,start_execution_date,GETDATE()) AS 'CurrentRunTime',
    CASE WHEN stop_execution_date IS NULL THEN 
            DATEDIFF(ss,start_execution_date,stop_execution_date) ELSE 0 END 'ActualRunTime',
    CASE 
        WHEN stop_execution_date IS NULL THEN 'JobRunning'
        WHEN DATEDIFF(ss,start_execution_date,stop_execution_date) 
            > (AvgRunTimeOnSucceed + AvgRunTimeOnSucceed * .05) THEN 'LongRunning-History'
        ELSE 'NormalRunning-History'
    END 'JobRun',
    CASE 
        WHEN stop_execution_date IS NULL THEN
            CASE WHEN DATEDIFF(ss,start_execution_date,GETDATE())
                        > (AvgRunTimeOnSucceed + AvgRunTimeOnSucceed * .05) THEN 'LongRunning-NOW'
            ELSE 'NormalRunning-NOW'
        END
        ELSE 'JobAlreadyDone'
    END AS 'JobRunning'
 FROM msdb.dbo.sysjobactivity ja
    INNER JOIN msdb.dbo.sysjobs j ON ja.job_id = j.job_id
INNER JOIN (
    SELECT job_id,
    AVG
    ((run_duration/10000 * 3600) + ((run_duration%10000)/100*60) + (run_duration%10000)%100)
    +
    STDEV
    ((run_duration/10000 * 3600) + ((run_duration%10000)/100*60) + (run_duration%10000)%100) AS 'AvgRuntimeOnSucceed'
     FROM msdb.dbo.sysjobhistory
    WHERE step_id = 0 AND run_status = 1
    GROUP BY job_id) art 
    ON j.job_id = art.job_id
WHERE 
(stop_execution_date IS NULL) OR 
    (DATEDIFF(ss,start_execution_date,stop_execution_date) > 60
    AND 
    CAST(LEFT(start_execution_date,11) AS DATETIME) = CAST(LEFT(GETDATE(),11) AS DATETIME))
ORDER BY start_execution_date DESC