2011-05-24 105 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

相關問題