Vorrei aggiungere alla risposta corretta di Mladen Prajdic e migliorare la risposta di kevchadders da SQL Server Central. La soluzione che propongo di seguito utilizza DBMail anziché SQLMail (che viene utilizzata dalla soluzione di SQLServerCentral tramite la chiamata xp_sendmail).In sostanza, SQLMail utilizza MAPI ed è più difficile da configurare e DBMail utilizza SMTP ed è più semplice da configurare. Ecco lo more information sulla differenza tra i due.
Non sono riuscito a far funzionare la soluzione di SQL Server Central in SQL 2005 e la soluzione riportata di seguito è stata testata solo durante l'installazione di SQL 2005 - YMMV in base alla versione.
In primo luogo, avrete bisogno di una nuova UDF, che si tradurrà l'ID del processo nel ID di processo per una 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
E poi lo sproc:
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
Questo sproc può essere pianificato facilmente come un processo di SQL Server Agent o qualsiasi altro metodo necessario. Non intraprende alcuna azione se il lavoro non è in esecuzione o è in esecuzione all'interno di parametri specificati. Invia l'e-mail se il lavoro è stato eseguito più a lungo di quanto specificato.
ad es.
EXEC sp_check_job_running 'JobNameGoesHere', 5, '[email protected]'
HT: http://www.sqlserverspecialists.co.uk/blog/_archives/2008/11/26/3996346.html
Potete darmi un po 'maggiori dettagli ? – muerte