小编典典

使用sp_send_dbmail的存储过程将电子邮件发送给从数据库查询的多个收件人

sql

就像标题所说的那样,我正在尝试创建一个存储过程,该过程用于将电子邮件发送到数据库中存储的地址,通常包括多个收件人。我已经尝试了一些方法来解决这个问题,但是我想我遇到了麻烦,并且感谢任何人提供的任何信息。我遇到的主要问题是查询数据库中的地址,然后以一种有效的方式将其传递给sp_send_dbmail。

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

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

因此,如果我们要发送ID号为“ a123”的电子邮件,则需要同时发送给史蒂夫和卡罗尔的电子邮件。

这是一个超级简单的过程。这不是逐字记录的,因为这一切都在我的工作计算机上,而是更多我所要追求的骨架。

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

阅读 186

收藏
2021-04-14

共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 // ........

注释编辑:

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

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

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

2021-04-14