Sql server 在SQL Server代理中重试尝试启动之前发送作业步骤的错误报告
在作业步骤尝试重试之前,是否可以捕获作业步骤的错误详细信息 我创建了一个jobSql server 在SQL Server代理中重试尝试启动之前发送作业步骤的错误报告,sql-server,sql-server-2016,sql-server-agent,Sql Server,Sql Server 2016,Sql Server Agent,在作业步骤尝试重试之前,是否可以捕获作业步骤的错误详细信息 我创建了一个jobMain\u workload,它有大约40个步骤。每个步骤配置为3次重试尝试,多数步骤的重试间隔设置为30分钟,少数作业步骤的重试间隔设置为60分钟 每当作业步骤失败时,它将在3次重试尝试后发送一封电子邮件,这意味着它将浪费大约1.5/3小时,具体取决于重试间隔 我需要的是,一旦作业步骤在尝试重试之前失败,它应该通过邮件发送错误详细信息,以便用户可以检查是环境问题(tempdb、diskspace等)还是需要立即修复
Main\u workload
,它有大约40个步骤。每个步骤配置为3次重试尝试,多数步骤的重试间隔设置为30分钟,少数作业步骤的重试间隔设置为60分钟
每当作业步骤失败时,它将在3次重试尝试后发送一封电子邮件,这意味着它将浪费大约1.5/3小时,具体取决于重试间隔
我需要的是,一旦作业步骤在尝试重试之前失败,它应该通过邮件发送错误详细信息,以便用户可以检查是环境问题(tempdb、diskspace等)还是需要立即修复的代码相关问题
为此,我创建了一个新的作业SCAN_作业,该作业将每10分钟运行一次,并扫描作业历史记录表,检查尝试的重试次数是否大于0,以确定运行日期时间是否大于SCAN_作业的上次执行时间。但这段代码的问题是,一旦第一次尝试登录到作业历史记录表中,我会在30分钟或1小时后发送邮件
请参见此屏幕截图:
该步骤在17:18:44失败,但一旦记录了重试尝试,将在18:20发送错误报告邮件
是否有办法在17:18发送邮件,而不是等待重试
消息列还将包含重试次数为0的行的错误详细信息。对于行的其余部分,它只是显示执行步骤的用户。我在下面的查询中没有得到正确的答案
我尝试执行的代码如下:
-- Get the job ID for the job this is running in.
DECLARE @JobID UNIQUEIDENTIFIER;
SET @JobID = (SELECT CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))));
-- Get the last time this job ran
DECLARE @LastRunTime DATETIME;
SET @LastRunTime = (SELECT MAX([msdb].[dbo].agent_datetime(jh.[run_date], jh.[run_time]))
FROM [msdb].[dbo].[sysjobhistory] jh
WHERE jh.[job_id] = @JobID);
SELECT
j.[name] AS JobName,
jh.[step_name] AS StepName,
[msdb].[dbo].agent_datetime(jh.[run_date], jh.[run_time]) AS RunDateTime,
jh.[message] as ErrorMessage
FROM
[msdb].[dbo].[sysjobs] j
INNER JOIN
[msdb].[dbo].[sysjobhistory] jh ON jh.[job_id] = j.[job_id]
INNER JOIN
[msdb].[dbo].[sysjobsteps] js ON js.[job_id] = j.[job_id]
AND js.[step_id] = jh.[step_id]
WHERE
jh.[retries_attempted] > 0
AND [msdb].[dbo].agent_datetime(jh.[run_date], jh.[run_time]) > DATEADD(SECOND, -1, @LastRunTime)
如果有更好的逻辑,请告诉我
谢谢我正在考虑删除jh。[重试次数]>0并将此条件放入jh。类似“%Error:%”和jh.run\u status=4的消息