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

Posted

技术标签:

【中文标题】如何在 SQL Server 2005 中将多行组合成以逗号分隔的列表?【英文标题】:How can I combine multiple rows into a comma-delimited list in SQL Server 2005? 【发布时间】:2010-09-15 20:29:31 【问题描述】:

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

SELECT X, Y FROM POINTS

返回结果如下:

X    Y
----------
12   3
15   2
18   12
20   29

我想在一行中返回所有结果,像这样(适合在 html 标签中使用):

XYLIST
----------
12,3,15,2,18,12,20,29

有没有办法只使用 SQL 来做到这一点?

【问题讨论】:

如果你想让你的应用程序扩展,最好在数据库之外做这种事情。数据库几乎总是你的瓶颈。 我想知道为什么好的答案消失了? @Joseph Bui - 相信我,我知道。不幸的是,项目负责人坚持让我这样做。 【参考方案1】:

从 SQL 2017 开始,可以使用STRING_AGG

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

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

【讨论】:

【参考方案2】:

感谢小伙伴们提供快速而有帮助的答案!

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

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

感谢这个人:

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

【讨论】:

我最喜欢这个解决方案。易于使用,只需一行即可添加任何 SQL。 注意:此方法会导致特殊字符被它们的 XML 等效字符替换。 IOW,Barnes & Noble 成为 Barnes &贵族【参考方案3】:

使用COALESCE 技巧,您不必担心结尾的逗号:

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

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

【讨论】:

【参考方案4】:
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。【参考方案5】:
DECLARE @s VarChar(8000)
SET @s = ''

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

SELECT @s 

去掉前面的逗号

【讨论】:

以上是关于如何在 SQL Server 2005 中将多行组合成以逗号分隔的列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中将多行文本连接成单个文本字符串

如何在 Microsoft SQL Server Management Studio 中将多行合并为一行,用逗号分隔

在 SQL Server 中将多行动态组合成多列

在 SQL Server 2005 中将不安全的程序集部署到生产环境

在 SQL Server 中将数据从一列拆分为多行

在SQL Server中将多行相同id的行合并为一行[关闭]