就像标题所说的那样,我正在尝试创建一个存储过程,该过程用于将电子邮件发送到数据库中存储的地址,通常包括多个收件人。我已经尝试了一些方法来解决这个问题,但是我想我遇到了麻烦,并且感谢任何人提供的任何信息。我遇到的主要问题是查询数据库中的地址,然后以一种有效的方式将其传递给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
您可以执行查询并将值分配给变量,如下所示:
DECLARE @myRecipientList varchar(max) SET @myRecipientList = (STUFF((SELECT ';' + emailaddress FROM table FOR XML PATH('')),1,1,''))
这会将您的@myRecipientLIst设置为“;” 分隔的收件人列表指定了您的查询。
您也可以使用SP执行相同的想法,只需将它们放入临时/变量表和stuff半冒号分隔的列表中即可。
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。