2011-12-06 141 views
1

我有一個複雜的select語句(多個查詢的聯合),它輸出單個列,例如將選擇列輸出轉換爲分號分隔列表sp_send_dbmail

| email   | 
| [email protected] | 
| [email protected] | 
| [email protected] | 

我想此送入sp_send_dbmail的這需要一個半結腸的@blind_copy_recipients(;)分隔的列表。

通常會使用COALESCE和一個變量來實現這一點,但您似乎無法通過UNION語句來做到這一點。

有沒有簡單的方法來做到這一點?

雖然打字這個問題是已經發生,我認爲更好的方法可能是通過記錄使用遊標循環和單獨發送的郵件,但我仍然有興趣在回答.....

回答

1

儘量避免遊標。

同時,試試這個:

DECLARE @blind_copy_recipients VARCHAR(4000) 
-- Or whatever is the suitable size you expect 

SELECT @blind_copy_recipients = COALESCE(@blind_copy_recipients + ', ', '') + 
    CAST(BCC.BLIND_COPY_RECIPIENTS_UNION_OUTPUT_COLUMN AS VARCHAR(50)) 
    -- Again, change to suit your needs 
FROM 
(
-- SELECT UNION SELECT UNION SELECT UNION -- 
) AS BCC 

SELECT @blind_copy_recipients 
1

您可以使用兩種方法:

  1. 將聯合結果放入臨時表中。
  2. 使用COALESCE。

  1. 使用結果作爲工會的一個子查詢。
  2. 使用COALESCE就可以了。
+0

也許就沒有必要利用臨時表,如果你可以從工會抓住它,如果像一個子查詢處理...或者從子查詢中抓取更昂貴的? – Nonym

+0

@Nonym你是對的,我已經編輯了答案。這可能取決於子查詢的「巨大」程度。 –

1

在CTE中粘貼選擇?

declare @addr varchar(1024) = '' 
;with T(addr) as (
    select email from emails where id = 1 
    union 
    select email from moreemails where id = 1 
    ... 
) 
select @addr += case @addr when '' then '' else ';' end + addr from T 
-1

可以存儲聯盟導致臨時表。

0

在T-SQL,您可以使用COALESCE這樣

declare @result nvarchar (max) 
set @result = '' 

select @result = coalesce (
        case when @result = '' 
        then YourColumnName 
        else @result + ',' + YourColumnName 
        end 
       ,'') 
from dbo.YourTableName 

print @result 
0

They are severalt methods to achieve this。 '黑盒XML的方法' 就是其中之一,這裏templeate:

SELECT p1.CategoryId, 
      (SELECT ProductName + ',' 
       FROM Northwind.dbo.Products p2 
      WHERE p2.CategoryId = p1.CategoryId 
      ORDER BY ProductName 
       FOR XML PATH('')) AS Products 
     FROM Northwind.dbo.Products p1 
    GROUP BY CategoryId ; 

對於您的模式

SELECT email + ',' 
    FROM yourComplexQuery p2 
    FOR XML PATH('') ; 

這裏的樣本:http://data.stackexchange.com/stackoverflow/q/120618/

相關問題