就像标题所说,我正在尝试制作一个存储过程,用于向存储在数据库中的地址发送电子邮件,通常包括多个收件人。我已经尝试了一些方法来解决这个问题,但我认为我已经碰壁了,并且会感谢任何人提出的任何意见。我遇到的主要问题是查询数据库中的地址,并以有效的方式将其传递给sp_send_dbmail。
地址表很简单,看起来像这样,但要大得多。两列都是varchars:
idNumber | email
__________________________
a123 | steve@test.com
a123 | carol@test.com
1-100 | mary@test.com
因此,如果我们发送身份证号码“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
答案 0 :(得分:4)
您可以执行查询并将值分配给变量:
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中附加找到的电子邮件和一个分号。