2011-05-24 56 views
1

我需要在SQL Server 2008中设置一个作业,以便在本月的第一个月向我们的客户发送电子邮件。但是,我不知道如何遍历子查询的结果。子查询返回的值超过1个

造成这种错误消息:

子查询返回大于1倍的值。 当 子查询遵循=,!=,<,< =,>,> = 或当子查询用作 表达式时,这是不允许的。

下面是相关代码:

SET @Recipients =(SELECT DISTINCT a.EMail 
     FROM a 
     --approximately 600 email addresses 

SET @MailSubject = 'Customer News' 
SET @MailRecipients = @Recipients 
SET @MailMessage = 'Dear customer, Attached is your customer news letter.' 

SET @FileName = N'E:file\to\be\attached.doc' 

EXEC msdb.dbo.sp_send_dbmail @recipients = @MailRecipients, 
    @body = @MailMessage, 
    @blind_copy_recipients='[email protected]', 
    @subject = @MailSubject, 
    @file_attachments = @FileName 
+0

这个*可能是一个考虑使用很少选择一个CURSOR的地方(如果操作变得势在必行并且不再基于集合)。但是,SQL Server也支持表变量[这里讨论与CURSOR](http://www.codeproject.com/KB/database/TableVariablesVSCursor.aspx)。一个“INSERTS INTO”表变量。什么是'sp_send_dbmail'程序的*签名*? (这将导致更好的答案,而不仅仅是“为什么它不起作用”;-) – 2011-05-24 20:09:44

回答

0

问题是@recipients = @MailRecipients。它期望一个字符串(一个电子邮件地址),并且您正在给它一个recordSet。

+0

你会如何解决这个问题?我可以设置这个存储过程循环访问记录集吗? – Mikki 2011-05-24 19:46:46

+0

在SET @Recipients调用之前发生错误的方式...存储的proc调用正常 – gbn 2011-05-24 19:49:11

4

的错误是在这儿,你有许多行试图将分配给一个变量

SET @Recipients =(SELECT DISTINCT a.EMail 
    FROM a 
    --approximately 600 email addresses 

你需要将其更改为分隔列表,从而

SET @Recipients = STUFF(
      (select DISTINCT ';' + CAST(a.EMail AS varchar(max)) 
      FROM a FOR XML PATH ('') 
      ) 
      ,1,1, '') 

注:@收件人需要是varchar(最大)

+0

谢谢。它似乎只发送列出的第二个电子邮件地址并截断电子邮件地址的第一个字母。 – Mikki 2011-05-24 19:53:38

+0

@Mikki:我不能测试(不需要SQL Server),但是XML PATH应该生成一个像这样的完整列表http://blog.programmingsolution.net/sql-server-2008/comma-separated-list-csv -of-rows-of-column-using-for-xml-path/ – gbn 2011-05-24 19:58:42

+0

谢谢你的回答,解决我的问题。 ;) – Vito 2014-06-20 06:50:27

相关问题