Я хотел бы добавить к правильному ответу Младена Прайдика и улучшить ответ кевчеддеров из SQL Server Central. Решение, которое я предлагаю ниже, использует DBMail вместо SQLMail (который используется решением SQLServerCentral посредством вызова xp_sendmail). По сути, SQLMail использует MAPI и сложнее в настройке, а DBMail использует SMTP и проще в настройке. Вот дополнительная информация о разнице между ними.
Я не смог заставить решение SQL Server Central работать в SQL 2005, и приведенное ниже решение было протестировано только на моей установке SQL 2005 - YMMV на основе версии.
Во-первых, вам понадобится новый UDF, который переведет идентификатор задания в идентификатор процесса для JOIN:
CREATE FUNCTION dbo.udf_SysJobs_GetProcessid(@job_id uniqueidentifier)
RETURNS VARCHAR(8)
AS
BEGIN
RETURN (substring(left(@job_id,8),7,2) +
substring(left(@job_id,8),5,2) +
substring(left(@job_id,8),3,2) +
substring(left(@job_id,8),1,2))
END
А потом спрок:
CREATE PROC sp_check_job_running
@job_name char(50),
@minutes_allowed int,
@person_to_notify varchar(50)
AS
DECLARE @minutes_running int,
@message_text varchar(255)
SELECT @minutes_running = isnull(DATEDIFF(mi, p.last_batch, getdate()), 0)
FROM master..sysprocesses p
JOIN msdb..sysjobs j ON dbo.udf_sysjobs_getprocessid(j.job_id) = substring(p.program_name,32,8)
WHERE j.name = @job_name
IF @minutes_running > @minutes_allowed
BEGIN
SELECT @message_text = ('Job ' + UPPER(SUBSTRING(@job_name,1,LEN(@job_name))) + ' has been running for ' + SUBSTRING(CAST(@minutes_running AS char(5)),1,LEN(CAST(@minutes_running AS char(5)))) + ' minutes, which is over the allowed run time of ' + SUBSTRING(CAST(@minutes_allowed AS char(5)),1,LEN(CAST(@minutes_allowed AS char(5)))) + ' minutes.')
EXEC msdb.dbo.sp_send_dbmail
@recipients = @person_to_notify,
@body = @message_text,
@subject = 'Long-Running Job to Check'
END
Это sproc может быть легко запланировано как задание агента SQL Server или любой другой необходимый метод. Он не предпринимает никаких действий, если задание не выполняется или выполняется в указанных параметрах. Он отправляет электронное письмо, если задание было выполнено дольше указанного.
, например
EXEC sp_check_job_running 'JobNameGoesHere', 5, 'admin@mycompany.com'
HT: http://www.sqlserverspecialists.co.uk/blog/_archives/2008/11/26/3996346.html