Уведомления для задания SQL при сбое шага

Попытка выяснить, есть ли способ настроить уведомления по электронной почте, когда всего 1 (или более) шагов не удается выполнить задание sql. У меня есть задание с 9 шагами, но каждый шаг должен быть установлен для перехода к следующему шагу, даже если он не выполняется. Таким образом, даже когда шаг терпит неудачу, потому что мне нужно, чтобы перейти к следующему шагу, он не установлен на «отчет об ошибке». Поскольку у агента SQL Server нет опции «Сообщить об ошибке и перейти к следующему шагу», мне интересно, есть ли у кого-нибудь обходные пути для получения уведомления.


person Mark Pulsinelli    schedule 12.02.2019    source источник
comment
Можете ли вы запрограммировать уведомление в шагах задания?   -  person Tab Alleman    schedule 12.02.2019
comment
Учитывая, что, вероятно, будет важно знать, какой шаг завершится ошибкой, было бы лучше использовать TRY...CATCH и отправить электронное письмо (от sp_send_dbmail) в формате CATCH.   -  person Larnu    schedule 12.02.2019


Ответы (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
comment
Это сработало почти идеально. Мы все еще используем SQL 2008, поэтому CONCAT не для нас. Просто избавился от CONCAT и добавил знак плюс между DATE и «Электронная почта об ошибке задания». Просто решил упомянуть об этом, если другие, использующие SQL 2008, попытаются реализовать это. Большое спасибо! - person Mark Pulsinelli; 25.02.2019
comment
Рад слышать. Единственное, что нужно иметь в виду, это то, что когда строки складываются вместе с использованием знака +, вся строка будет нулевой, если одна из них равна. Поскольку это только объединение GETDATE() и статического текста, это не будет проблемой, но в противном случае просто убедитесь, что значения NULL учитываются с помощью COALESCE. - person userfl89; 25.02.2019