2010-03-02 46 views
7

Possible Duplicate:
SQL Server: Can I Comma Delimit Multiple Rows Into One Column?加入查询结果以逗号分隔值的单行

我有这样的查询:

SELECT name from users 

,它的结果是一个数字的记录:

1 user1 
2 user2 
3 user3 

我想用逗号分隔所有这些记录:

user1, user2, user3 

如果查询结果为空,则为空行。

如何使用T-SQL得到这个? UNPIVOT

+1

@OMG:不同意,因为答案是非常不同的 – abatishchev 2010-07-27 06:33:34

回答

17

可以使用COALESCE函数来实现这一目标:

declare @result varchar(max) 

select @result = COALESCE(@result + ', ', '') + name 
from users 

select @result 

这将在SQL Server 2000及更高版本(可能更早版本太)。请注意,尽管您在sql server 2000中没有varchar(max)。

在SQL Server的更高版本(2005年以后),也有可能做到这一点使用XML路径()

select name + ',' 
from users 
for xml path('') 
+0

@David Hall:我喜欢第一个。第二个不幸的是在每个记录的末尾添加了一个逗号,也是最后一个。 – abatishchev 2010-03-02 22:25:21

+1

@abatishchev很高兴你觉得这有帮助。看看这篇文章http://msmvps.com/blogs/robfarley/archive/2007/04/08/coalesce-is-not-the-answer-to-string-concatentation-in-t-sql.aspx您可能会发现对于较大的结果集,xml路径方法更好。 – 2010-03-02 22:29:54

+0

只有一定数量的数据时,这很容易。但是,如果您只想要部分数据,请仅说“user1和user2” - 这将失败,并显示以下错误: **子查询返回的值超过1个。当子查询遵循=,!=,<, <= , >,> =或当子查询用作表达式时,这是不允许的。** – 2017-01-29 12:39:35

0
declare @result varchar(max) 
set @result = '' 
select @result = @result + name + ',' from users 
if @result <> '' set @result = left(@result,len(@result)-1) 
print @result 
+0

@DyingCactus:如何把这种像“用户1,用户2,用户3,...用户N”可能递归方式生成的字符串的周期出来 – abatishchev 2010-03-02 22:13:47

+0

你的意思是如何得到不带逗号的字符串在一个声明结束?大卫霍尔的答案会做到这一点。 – DyingCactus 2010-03-02 22:40:31

1

你可以像下面这样做太除了它没有格式化所有的很好的时候显示在DOS命令:

echo Batch file SQL 2005 
echo. 
"%PROGRAMFILES%\Microsoft SQL Server\90\Tools\BINN\osql" -S . -E -Q "SELECT name + ', ' FROM sysdatabases order by name for XML PATH('')"