【问题标题】:How to call sdb.dbo.sp_send_dbmail for each row of a sql result set如何为 sql 结果集的每一行调用 sdb.dbo.sp_send_dbmail
【发布时间】:2016-01-06 14:29:23
【问题描述】:

我有一个名为 EMails 的 SQL Server 表,它由列组成

  • Id int,
  • 主题 nvarchar(100)
  • 正文 nvarchar(MAX),
  • 收件人 nvarchar(100)
  • IsSent 位

我的应用程序填充它。

我想使用 SQL Server 发送电子邮件。

我知道如何发送电子邮件

EXEC msdb.dbo.sp_send_dbmail

但是查询

SELECT Subject,Body,Recipient FROM EMails
WHERE IsSent=0

最多可以返回多个

我还想在邮件发送后将IsSent 设置为1

问题:

  1. 是否可以使用计划的 SQL Server 作业。如果可以,能否提供代码示例?

  2. 当查询放入每 15 分钟运行一次的 sql server 作业时,是否建议最多发送 50 封电子邮件

【问题讨论】:

  • 这是极少数情况下光标是最佳选择的情况之一。您只需要遍历每一行并发送您的电子邮件。 sql server 作业并不比 windows 中的计划任务更复杂。您通过一个步骤来设置作业以执行您的过程并给它一个时间表。您可以根据需要尽可能频繁地运行它。

标签: sql-server sql-server-2012


【解决方案1】:
DECLARE @Subject NVARCHAR(100),
        @Body NVARCHAR(MAX),
        @Recipient NVARCHAR(100),
        @ID INT,
        @MailID INT

DECLARE @mails TABLE (ID INT, MailID INT)

DECLARE cur CURSOR FAST_FORWARD READ_ONLY LOCAL FOR
    SELECT ID, [Subject], Body, Recipient
    FROM dbo.EMails
    WHERE IsSent = 0

OPEN cur

FETCH NEXT FROM cur INTO @ID, @Subject, @Body, @Recipient

WHILE @@FETCH_STATUS = 0 BEGIN

    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = '....',
        @recipients   = @Recipient,
        @subject      = @Subject,
        @body         = @Body,
        @mailitem_id  = @MailID OUTPUT

    INSERT INTO @mails (ID, MailID)
    VALUES (@ID, @MailID)

    FETCH NEXT FROM cur INTO @ID, @Subject, @Body, @Recipient

END

CLOSE cur
DEALLOCATE cur

WAITFOR DELAY '00:00:01'

UPDATE u
SET IsSent = 1
FROM dbo.EMails u
JOIN @mails m ON u.ID = m.ID
JOIN msdb.dbo.sysmail_mailitems s ON m.MailID = s.mailitem_id
WHERE s.sent_status = 1

-- failed mails

SELECT s.recipients, s.[subject], s.body, s.sent_status
FROM @mails m
JOIN msdb.dbo.sysmail_mailitems s ON m.MailID = s.mailitem_id
WHERE s.sent_status != 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多