我有一个复杂的select语句(几个查询的并集),它输出一个列,例如
| email |
| test@domain.com |
| test2@domain.com |
| test3@domain.com |
我想将它提供给sp_send_dbmail的@blind_copy_recipients,它需要一个分号(;)分隔列表。
通常会使用COALESCE和变量来完成此操作,但是使用UNIONS语句似乎无法做到这一点。
有一种简单的方法吗?
虽然输入这个问题已经发生在我身上,但更好的办法可能是使用光标循环记录并单独发送消息,但我仍然对答案感兴趣......
答案 0 :(得分:1)
您可以使用两种方法完成此操作:
或
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分: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
答案 4 :(得分:0)
They are severalt methods to achieve this。 “黑盒子XML方法”就是其中之一,这里是一个模板:
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/
答案 5 :(得分:-1)
您可以将Union结果存储在临时表中。