如何在SQL Server 2005中将多行合并为逗号分隔列表?

57

现在,我有一个类似于这样的SQL查询:

SELECT X, Y FROM POINTS

它返回的结果如下:
X    Y
----------
12   3
15   2
18   12
20   29

我希望将结果全部放在一行中,像这样(适用于在HTML的<AREA>标签中使用):
XYLIST
----------
12,3,15,2,18,12,20,29

有没有一种只使用SQL就能完成这个操作的方法?


如果你想让你的应用程序扩展,最好在数据库之外处理这种事情。数据库几乎总是瓶颈所在。 - Joseph Bui
我在想为什么好的答案消失了? - Lance Roberts
@Joseph Bui - 相信我,我知道。不幸的是,项目负责人坚持让我这样做。 - Joshua Carmody
5个回答

101

谢谢大家快速且有帮助的回答!

我刚刚又发现了另一种快速完成这件事的方法:

SELECT  STUFF(( SELECT ',' + X + ',' + Y
                FROM Points
              FOR
                XML PATH('')
              ), 1, 1, '') AS XYList

感谢这位大佬:

链接


我非常喜欢这个解决方案。它易于使用,只需在任何SQL中添加一行即可。 - Tai Kahar
2
注意:该方法会导致特殊字符被替换为它们的 XML 等效形式。即,Barnes & Noble 将变成 Barnes & Noble。 - SvdSinner

31
DECLARE @XYList varchar(MAX)
SET @XYList = ''

SELECT @XYList = @XYList + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y) + ','
FROM POINTS

-- Remove last comma
SELECT LEFT(@XYList, LEN(@XYList) - 1)

是我还是这个在链接服务器上不起作用?当我尝试像这样的东西 SELECT @List = @List + CONVERT(varchar, ID) + ',' FROM LinkedServer.MyDatabase.dbo.MyTable 它总是只返回一个ID。而 Select * 返回许多ID。 - Martin

17

15

使用 COALESCE 技巧,您无需担心尾随逗号:

DECLARE @XYList AS varchar(MAX) -- Leave as NULL

SELECT @XYList = COALESCE(@XYList + ',', '') + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y)
FROM POINTS

2
DECLARE @s VarChar(8000)
SET @s = ''

SELECT @s = @s + ',' + CAST(X AS VarChar) + ',' + CAST(Y AS VarChar) 
FROM POINTS

SELECT @s 

只需去掉前导逗号即可


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接