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

How can I combine multiple rows into a comma-delimited list in SQL Server 2005?

提问人:Joshua Carmody 提问时间:10/8/2008 最后编辑:Joshua Carmody 更新时间:8/6/2022 访问量:95022

问:

现在,我有一个像这样的 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来做到这一点?

SQL Server 列表 函数 串联

评论

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

答:

2赞 Peter 10/8/2008 #1
DECLARE @s VarChar(8000)
SET @s = ''

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

SELECT @s 

只需去掉前导逗号即可

31赞 Ben Hoffstein 10/8/2008 #2
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)

评论

0赞 Martin 11/5/2014
是我还是这在链接服务器上不起作用?当我尝试类似的东西时,它总是只返回一个 ID。A 返回多个 ID。SELECT @List = @List + CONVERT(varchar, ID) + ',' FROM LinkedServer.MyDatabase.dbo.MyTableSelect *
101赞 Joshua Carmody 10/8/2008 #3

感谢您的快速和有用的答案!

我也找到了另一种快速的方法来做到这一点:

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

功劳归于这个人:

链接

评论

0赞 Tai Kahar 10/23/2012
我真的很喜欢这个解决方案。易于使用,只需一行即可添加到任何 SQL 中。
2赞 SvdSinner 5/1/2018
注意:此方法会导致特殊字符替换为其等效的 XML 字符。IOW,Barnes & Noble 更名为 Barnes &高贵
15赞 Cade Roux 10/8/2008 #4

使用这个技巧,您不必担心尾随逗号:COALESCE

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

SELECT @XYList = COALESCE(@XYList + ',', '') + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y)
FROM POINTS
17赞 Carter Medlin 7/12/2018 #5

从 SQL 2017 开始,可以使用STRING_AGG

SELECT STRING_AGG (X + ',' + Y, ',') AS XYLIST
FROM POINTS

https://learn.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017