Попытка выяснить, есть ли способ настроить уведомления по электронной почте, когда всего 1 (или более) шагов не удается выполнить задание sql. У меня есть задание с 9 шагами, но каждый шаг должен быть установлен для перехода к следующему шагу, даже если он не выполняется. Таким образом, даже когда шаг терпит неудачу, потому что мне нужно, чтобы перейти к следующему шагу, он не установлен на «отчет об ошибке». Поскольку у агента SQL Server нет опции «Сообщить об ошибке и перейти к следующему шагу», мне интересно, есть ли у кого-нибудь обходные пути для получения уведомления.
Уведомления для задания SQL при сбое шага
Ответы (1)
Вы можете добавить дополнительный шаг задания, чтобы запросить msdb
таблицы шагов, которые не удалось выполнить. После этого хранимая процедура sp_send_dbmail
может быть использована для отправки электронного письма с ошибками, если они возникли. Столбец run_date
в SYSJOBHISTORY
является столбцом int, поэтому дата будет в формате ГГГГММДД. Фильтр ниже в столбце run_status
будет применяться к отдельным шагам независимо от общего результата задания, при этом 0 указывает на неудачный статус.
DECLARE @JobExecutionDate INT
--current date
SET @JobExecutionDate = CAST(CONVERT(VARCHAR(8),GETDATE(),112) AS INT)
--check if there were any errors first
IF EXISTS (SELECT h.instance_id
FROM MSDB.DBO.SYSJOBHISTORY h
INNER JOIN MSDB.DBO.SYSJOBS j ON h.job_id = j.job_id
INNER JOIN MSDB.DBO.SYSJOBSTEPS s ON j.job_id = s.job_id AND h.step_id = s.step_id
WHERE h.run_status = 0 AND h.run_date = @JobExecutionDate AND j.name = 'YourJobName')
BEGIN
DECLARE @Title VARCHAR(50)
SET @Title = CONCAT(CONVERT(VARCHAR(12), CAST(GETDATE() AS DATE), 109), ' Job Error Email')
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Your Database Mail Profile',
@recipients = '[email protected]',
@query = 'SELECT j.[name] AS JobName,
s.step_name AS StepName,
h.run_date AS RunDate,
h.run_time AS RunTime,
h.sql_severity As ErrorSeverity,
h.message AS ErrorMessage
FROM MSDB.DBO.SYSJOBHISTORY h
INNER JOIN MSDB.DBO.SYSJOBS j ON h.job_id = j.job_id
INNER JOIN MSDB.DBO.SYSJOBSTEPS s ON j.job_id = s.job_id AND h.step_id = s.step_id
WHERE h.run_status = 0 AND h.run_date = CAST(CONVERT(VARCHAR(8),GETDATE(),112) AS INT) AND j.name = ''YourJobName''
',
@query_result_no_padding = 1,
@subject = @Title ;
END
person
userfl89
schedule
12.02.2019
Это сработало почти идеально. Мы все еще используем SQL 2008, поэтому CONCAT не для нас. Просто избавился от CONCAT и добавил знак плюс между DATE и «Электронная почта об ошибке задания». Просто решил упомянуть об этом, если другие, использующие SQL 2008, попытаются реализовать это. Большое спасибо!
- person Mark Pulsinelli; 25.02.2019
Рад слышать. Единственное, что нужно иметь в виду, это то, что когда строки складываются вместе с использованием знака +, вся строка будет нулевой, если одна из них равна. Поскольку это только объединение GETDATE() и статического текста, это не будет проблемой, но в противном случае просто убедитесь, что значения NULL учитываются с помощью COALESCE.
- person userfl89; 25.02.2019
TRY...CATCH
и отправить электронное письмо (отsp_send_dbmail
) в форматеCATCH
. - person Larnu   schedule 12.02.2019