我有一个名为 EMails
的 SQL Server 表,它由列组成
- Id int,
- Subject nvarchar(100)
- Body nvarchar(MAX),
- Recipient nvarchar(100)
- IsSent bit
我的应用程序填充它。
我想使用 SQL Server 发送电子邮件。
我知道如何发送电子邮件
EXEC msdb.dbo.sp_send_dbmail
但是查询
SELECT Subject,Body,Recipient FROM EMails
WHERE IsSent=0
最多可以返回多个
我还想在邮件发送后将IsSent
设置为1
。
问题:
是否可以使用计划的 SQL Server 作业。如果可以的话可以提供一个代码示例吗?
当查询放入每 15 分钟运行一次的 SQL Server 作业中时,是否建议最多发送 50 封电子邮件
最佳答案
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
关于sql-server - 如何为 sql 结果集的每一行调用 sdb.dbo.sp_send_dbmail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34635550/