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

Jos*_*ody 46 sql sql-server function list concatenation

现在,我有一个像这样的SQL查询:

SELECT X, Y FROM POINTS
Run Code Online (Sandbox Code Playgroud)

它返回结果如下:

X    Y
----------
12   3
15   2
18   12
20   29
Run Code Online (Sandbox Code Playgroud)

我想在一行中返回结果,如下所示(适合在HTML <AREA>标记中使用):

XYLIST
----------
12,3,15,2,18,12,20,29
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用SQL?

Jos*_*ody 78

感谢快速而有用的答案!

我刚刚找到了另一种快速方法:

SELECT  STUFF(( SELECT ',' + X + ',' + Y
                FROM Points
              FOR
                XML PATH('')
              ), 1, 1, '') AS XYList
Run Code Online (Sandbox Code Playgroud)

归功于这家伙:

http://geekswithblogs.net/mnf/archive/2007/10/02/t-sql-user-defined-function-to-concatenate-column-to-csv-string.aspx

  • 注意:此方法会使特殊字符替换为其XML等效字符.IOW,Barnes&Noble成为Barnes&amp; 高贵 (2认同)

Ben*_*ein 28

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)
Run Code Online (Sandbox Code Playgroud)


Cad*_*oux 14

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

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

SELECT @XYList = COALESCE(@XYList + ',', '') + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y)
FROM POINTS
Run Code Online (Sandbox Code Playgroud)


Car*_*lin 6

从SQL 2017开始,您可以使用 STRING_AGG

SELECT STRING_AGG (X + ',' + Y, ',') AS XYLIST
FROM POINTS
Run Code Online (Sandbox Code Playgroud)

https://docs.microsoft.com/zh-cn/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017