【问题标题】:Notifications for SQL Job when a step fails步骤失败时的 SQL 作业通知
【发布时间】:2019-02-12 18:14:08
【问题描述】:

当 sql 作业只有 1 个(或更多)步骤失败时,尝试找出是否有设置电子邮件通知的方法。我有一个有 9 个步骤的工作,但是每个步骤都需要设置为即使失败也可以继续下一步。所以即使一个步骤失败,因为我需要它去下一步它没有设置为“报告失败”。由于 SQL Server 代理没有“报告失败并转到下一步”选项,我想知道是否有人有任何解决方法来获取通知

【问题讨论】:

  • 你能在工作步骤中编写通知吗?
  • 考虑到知道哪个步骤失败可能很重要,使用TRY...CATCH 并在@987654323 中发送电子邮件(由sp_send_dbmail)似乎是一个“更好”的想法@.

标签: sql sql-server ssms sql-agent


【解决方案1】:

您可以添加一个额外的作业步骤来查询msdb 表以查找失败的步骤。在此之后,sp_send_dbmail 存储过程可用于发送包含错误的电子邮件(如果发生任何错误)。 SYSJOBHISTORYrun_date 列是一个 int 列,因此日期将采用 YYYYMMDD 的格式。 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 = 'ExampleEmail@Domain.com',  
@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

【讨论】:

  • 这几乎是完美的。我们仍在使用 SQL 2008,因此 CONCAT 不适合我们。刚刚摆脱了 CONCAT 并在 DATE 和“作业错误电子邮件”之间添加了一个加号——只是想我会提到,如果其他使用 SQL 2008 的人尝试实现这一点。非常感谢!
  • 很高兴听到。唯一要记住的是,当使用 + 号将字符串相加时,如果其中一个为空,则整个字符串将为空。由于这只是连接 GETDATE() 和静态文本,因此不会有问题,但除此之外,请确保使用 COALESCE 考虑空值。
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2017-03-25
相关资源
最近更新 更多