Sql server 2008 子查询返回了多个值

Sql server 2008 子查询返回了多个值,sql-server-2008,loops,subquery,Sql Server 2008,Loops,Subquery,我需要在SQL Server 2008中设置一个作业,以便在本月初向客户发送电子邮件时运行。但是,我不知道如何循环子查询的结果 导致此错误消息的原因: 子查询返回了多个值。 这是不允许的,因为 子查询后面是=,!== 或者当子查询用作 表情 以下是相关代码: SET @Recipients =(SELECT DISTINCT a.EMail FROM a --approximately 600 email addresses SET @MailSubje

我需要在SQL Server 2008中设置一个作业,以便在本月初向客户发送电子邮件时运行。但是,我不知道如何循环子查询的结果

导致此错误消息的原因:

子查询返回了多个值。 这是不允许的,因为 子查询后面是=,!== 或者当子查询用作 表情

以下是相关代码:

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='misj@mikl.org', 
    @subject = @MailSubject,
    @file_attachments  = @FileName

问题是
@recipients=@MailRecipients
。它需要一个字符串(电子邮件地址),而您正在给它一个记录集。

问题是
@recipients=@MailRecipients
。它需要一个字符串(一个电子邮件地址),而您正在给它一个记录集。

错误在这里,您有许多行试图分配给单个变量

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, '') 

注意:@Recipients将需要是varchar(max)

这里的错误是您有许多行试图分配给单个变量

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, '') 

注意:@Recipients需要是varchar(max)

您如何更正此问题?我可以将此存储过程设置为在记录集中循环吗?错误发生在set@Recipients调用之前。。。存储过程调用正常,您如何更正此问题?我可以将此存储过程设置为在记录集中循环吗?错误发生在set@Recipients调用之前。。。存储过程调用正常。谢谢。它似乎只发送列出的第二个电子邮件地址,并截断电子邮件地址的第一个字母。@Mikki:我无法测试(手头没有SQL Server),但XML路径应生成如下完整列表谢谢。它似乎只发送了第二个电子邮件地址,并截断了电子邮件地址的第一个字母。@ Mikki:我不能测试(没有SQL Server到手),但是XML路径应该生成这样一个完整的列表。这可能是一个考虑使用Real-Go选择光标的地方(如果操作已经变得势在必行,并且不再是基于设置)。但是,SQL Server还支持表变量。一个
插入到表变量中。
sp\u send\u dbmail
过程的签名是什么?(这将导致更好的答案,而不仅仅是“为什么它不起作用”;-)这可能是一个考虑使用稀有的好选择光标的地方(如果操作已经变得势在必行,并且不再是基于设置)。但是,SQL Server还支持表变量。一个
插入到表变量中。
sp\u send\u dbmail
过程的签名是什么?(这将导致更好的答案,而不仅仅是“为什么它不起作用”;-)