从自定义电子邮件表发送电子邮件的代理作业

Posted

技术标签:

【中文标题】从自定义电子邮件表发送电子邮件的代理作业【英文标题】:Agent job that emails from custom email table 【发布时间】:2013-10-24 14:31:01 【问题描述】:

我曾经在我的数据库中使用cursors / sp_send_dbmail 在某些列更新时发送电子邮件的触发器。有人告诉我这不是最佳实践,所以我创建了一个名为 EmailNotify 的新表,其中包含收件人、主题、正文等列。因此,触发器现在将我要发送的电子邮件插入到此表中。

我想创建一个每隔几分钟运行一次的作业来检查此表和电子邮件。下面的项目是我想出的,但在这种情况下可以使用游标吗?该表是否应该包含一个已发送字段,以便我知道我发送了哪些行?我可以在光标内更改它吗?还是建议事后截断表格?

DECLARE @emailSubject AS NVARCHAR(100);
DECLARE @emailRecipients AS NVARCHAR(100);
DECLARE @emailBody AS NVARCHAR(max);

DECLARE cur CURSOR LOCAL READ_ONLY FAST_FORWARD FOR
    SELECT
        recipients,
        subject,
        body
    FROM 
       EmailNotify;

OPEN cur

FETCH NEXT FROM cur INTO 
    @emailRecipients,
    @emailSubject,
    @emailBody

WHILE @@FETCH_STATUS = 0
BEGIN

        EXEC msdb.dbo.sp_send_dbmail
                @profile_name = 'name',
                @recipients = @emailRecipients,
                @body = @emailBody,
                @body_format = 'html',
                @subject =  @emailSubject;

        FETCH NEXT FROM cur INTO 
            @emailRecipients,
            @emailSubject,
            @emailBody
END

CLOSE cur
DEALLOCATE cur

【问题讨论】:

【参考方案1】:

我愿意

    EmailSent(DATETIME) = NULL 列添加到您的表中 在 proc 的顶部创建一个 EmailSent 变量并将其设置为 GETDATE() UPDATE <YOURTABLE> SET EmailSent = @EmailSent WHERE EmailSent IS NULL 在您的电子邮件查询中添加WHERE EmailSent = @EmailSent

您可以使用带有订阅或数据绑定订阅的 s-s-rS 报告而不是此作业来完成此操作,但这实际上只是一个偏好问题。在 s-s-rS 中格式化更容易,否则您会在消息正文中弄乱动态 HTML。去过那里,不愉快。

【讨论】:

如果你喜欢这类问题/答案,那么我打赌你会喜欢CodeReview :)

以上是关于从自定义电子邮件表发送电子邮件的代理作业的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 代理作业在失败时通知多个操作员

错误:注意:无法通过电子邮件通知“操作员”。当作业失败时尝试发送电子邮件

SQL 维护计划在未配置邮件时发送邮件

Rails:从自定义验证器调用标准验证

带有流分析的电子邮件通知

wp_mail() 将电子邮件主题中的“-”转换为“-”