SQL Server 2008:如何在 SQL Server 代理作业中的一个步骤失败但整体作业成功时发送电子邮件

phi*_*ile 7 sql-server-2008 sql-server

我有一个包含 6 个步骤的 SQL Server 作业。无论前四个步骤是否失败,都必须运行步骤 5 和 6,因此如果前四个作业失败,则将它们设置为跳到步骤 5。

但是,如果第 5 步和第 6 步成功,则整个工作被视为成功。我为作业失败设置了电子邮件通知,但如果前四个步骤中的任何一个由于整体作业被视为成功而失败,我将不会收到电子邮件。我希望这种情况发生。

将前四个步骤拆分为单独的工作并不理想,因为它们必须在第 5 步和第 6 步开始之前完成。

请任何人都可以给我建议来解决这个问题,以便:

  1. 即使步骤 1-4 中的任何一个失败,步骤 5 和 6 也会运行。
  2. 步骤 5 和 6 必须在步骤 1-4 完成之前开始。
  3. 当步骤 1-4 中的任何一个失败时,会发送一封电子邮件通知,指示失败的步骤。

非常感谢您的帮助。

Han*_*non 11

您可以为步骤 1-4 创建一个存储过程,错误处理会在失败时通过电子邮件通知您。

就像是:

CREATE PROCEDURE TestEmailOnFail
AS
BEGIN
    BEGIN TRY
        /*
            Perform some action that might fail
        */
        SELECT 0/0; --THIS WILL FAIL
    END TRY
    BEGIN CATCH
        DECLARE @subject nvarchar(max) = 'Job Failure Notification';
        DECLARE @body nvarchar(max) = 'TestEmailOnFail Job Failed' 
            + CHAR(10) + CHAR(13) + 'Error Number:  ' + CAST(ERROR_NUMBER() AS nvarchar(max))
            + CHAR(10) + CHAR(13) + 'Error Message: ' + ERROR_MESSAGE();
        DECLARE @to nvarchar(max) = 'somebody@email.com';
        DECLARE @profile_name sysname = 'SQLMailProfileName';
        EXEC msdb.dbo.sp_send_dbmail @profile_name = @profile_name,
            @recipients = @to, @subject = @subject, @body = @body;
    END CATCH
END
Run Code Online (Sandbox Code Playgroud)

我刚刚使用我的 SQL 邮件配置文件和我的电子邮件地址对此进行了测试,并收到了以下电子邮件:

TestEmailOnFail Job Failed
Error Number:  8134
Error Message: Divide by zero error encountered.
Run Code Online (Sandbox Code Playgroud)


Aar*_*and 6

  1. 创建一个步骤 4a,它会发送一封通用电子邮件(就像@Max 指出的那样)“前 4 个步骤之一失败了”。您可以使用数据库邮件或您现在使用的任何方式来执行此操作,以提醒作业失败。
  2. 步骤 4a 设置为成功后移至步骤 5。
  3. 第 4 步设置为成功后移至第 5 步。
  4. 步骤 1-4 设置为在失败时移至步骤 4a。

如果您需要知道哪个步骤失败了,您可能只想将逻辑放入每个步骤(类似于 Max 提出的)以在作业步骤逻辑中执行 TRY/CATCH,而不是构建 4 个处理程序步骤并使用作业脚手架。