【问题标题】:Stored procedure using sp_send_dbmail to send emails to multiple recipients queried from database存储过程使用 sp_send_dbmail 向从数据库查询的多个收件人发送电子邮件
【发布时间】:2014-09-30 01:42:23
【问题描述】:

正如标题所说,我正在尝试创建一个存储过程,用于将电子邮件发送到存储在数据库中的地址,通常包括多个收件人。我已经尝试了一些方法来解决这个问题,但我想我碰壁了,我会很感激任何人的任何意见。我遇到的主要问题是在数据库中查询地址并以一种可行的方式将其传递给 sp_send_dbmail。

地址表非常简单,看起来像这样,但要大得多。两列都是 varchars:

idNumber   |  email
__________________________
   a123    |  steve@test.com
   a123    |  carol@test.com
   1-100   |  mary@test.com

因此,如果我们要向 ID 号“a123”发送电子邮件,则需要同时发送一封电子邮件给 Steve 和 Carol。

这是一个超级简单的程序。这不是逐字逐句的,因为这一切都在我的工作计算机上,但更多的是我所追求的基本要点。

CREATE PROCEDURE sendMail
  @idNumber varchar(MAX),
  @subject varchar(MAX),
  @body varchar(MAX)
EXEC msdb.dbo.sp_send_dbmail
  @recipients = "EXEC SELECT email FROM emailTable WHERE idNumber = " + @idNumber + "';",
  @subject = @subject,
  @body = @body;

抛出错误;它似乎不喜欢将 ID 参数连接到查询中。我尝试制作一个单独的程序来查询电子邮件,但将 ID 参数传递给该程序似乎也不起作用。即使我确实成功地传递了参数并让查询成功执行,我仍然需要将两个结果连接到一个字符串中并用分号分隔它们,这样它们才能与 sp_send_dbmail 配合使用。我想?

SQL 向导,您将如何处理这个问题?我没有丰富的经验,所以有什么简单的句法我做错了吗?我的方法有根本缺陷吗?

感谢您的意见。谢谢。

编辑:这是 Kritner 的有效解决方案!非常感谢!

CREATE PROCEDURE testMail2
@idNumber varchar(MAX)
AS
BEGIN
DECLARE @recipientList varchar(MAX)
SET @recipientList = (STUFF((SELECT ';' + email FROM emailTable WHERE idNumber = @idNumber FOR XML PATH(' ')),1,1,''))
EXEC msdb..sp_send_dbmail
@recipients=@recipientList,
@subject='Subject Line',
@body='Body Text'
END

【问题讨论】:

  • 我更新了我的答案,在 @recipientList 分配中的 select 语句周围有一个 ()。此外,引号之间有一个空格 FOR XML PATH(''),它应该是 FOR XML PATH('')

标签: sql sql-server database stored-procedures sp-send-dbmail


【解决方案1】:

您可以进行查询并将值分配给变量,如下所示:

DECLARE @myRecipientList varchar(max)
SET @myRecipientList = (STUFF((SELECT ';' + emailaddress FROM table FOR XML PATH('')),1,1,''))

这会将您的@myRecipientLIst 设置为“;”指定查询的收件人的分隔列表。

您也可以对 SP 做同样的想法,只需将它们放入临时/变量表中,然后将 stuff 放入分号分隔的列表中。

编辑:

终于可以发邮件了:

EXEC msdb.dbo.sp_send_dbmail
  @recipients = @recipientList,
  @subject = @subject,
  @body = @body // ........

评论编辑:

根据您的原始查询,您的 stuff 查询应如下所示:

DECLARE @myRecipientList varchar(max)
SET @myRecipientList = STUFF((SELECT ';' + email FROM emailTable WHERE idNumber = @idNumber FOR XML PATH('')),1,1,'')

这背后的想法是 - 对于在电子邮件表中找到的每封电子邮件,将找到的电子邮件附加到 @myrecipientList 和一个分号。

【讨论】:

  • myRecipientList 位很有帮助,现在我知道如何用分号将它们连接到一个字符串中。谢谢!我遇到的问题之一是执行查询。当我尝试将 @idNumber 参数连接到查询中时,它会引发错误。关于第二次编辑-我希望我可以发送到一封电子邮件!但遗憾的是,所有与 ID 号相关的电子邮件都需要得到通知。
  • 哦!感谢您的评论编辑,我很密集,错过了您原来的帖子。谢谢!明天早上我回到工作岗位时,我会试一试,然后告诉你进展如何。 :)
  • 看起来它在 FOR XML 部分有点赶上 - 我将细节编辑到原始帖子中。
  • 非常好,效果非常好!你是救命稻草,我相信我的老板会很高兴,我有时间吃午饭!
猜你喜欢
  • 2015-06-07
  • 2013-03-09
  • 2017-12-11
  • 2016-05-22
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
相关资源
最近更新 更多