Sql server 2005 如何将多行中的所有值合并到一行中?

Sql server 2005 如何将多行中的所有值合并到一行中?,sql-server-2005,tsql,Sql Server 2005,Tsql,假设我有一个疑问: SELECT Foo FROM Bar 返回 福 A. B C 我真正想要的是: 福 A、 B,C 因此,所有行中的所有值都已折叠为一行,逗号是可选的。 有没有办法使用select语句来执行此操作,因为我不想使用游标?Ross DECLARE @foos VARCHAR(4000) SELECT @foos = COALESCE(@foos + ',', '') + Foo FROM Bar SELECT @foos AS Foo 这应该让你开始 DECLARE

假设我有一个疑问:

SELECT Foo FROM Bar
返回

福 A. B C

我真正想要的是: 福 A、 B,C

因此,所有行中的所有值都已折叠为一行,逗号是可选的。 有没有办法使用select语句来执行此操作,因为我不想使用游标?

Ross

DECLARE @foos VARCHAR(4000)

SELECT @foos = COALESCE(@foos + ',', '') + Foo FROM Bar

SELECT @foos AS Foo
这应该让你开始

  DECLARE @r VARCHAR(8000)
  SELECT @r = (SELECT DISTINCT Foo + ', ' FROM Bar FOR XML PATH(''))
  IF @r IS NOT NULL AND @r <> '' SET @r = SUBSTRING(@r, 1, LEN(@r)-1)
  SELECT @r
罗斯

这应该让你开始

  DECLARE @r VARCHAR(8000)
  SELECT @r = (SELECT DISTINCT Foo + ', ' FROM Bar FOR XML PATH(''))
  IF @r IS NOT NULL AND @r <> '' SET @r = SUBSTRING(@r, 1, LEN(@r)-1)
  SELECT @r
试试下面的方法

declare @joined varchar(max)
set @joined = ''

select  @joined = @joined + IsNull(Foo + ',', '')
from    Bar (nolock)

--; Drop last "," if necessary
set @joined = substring(@joined, 1, len(@joined) - (case when len(@joined) > 0 then 1 else 0 end))
select  @joined as foo
试试下面的方法

declare @joined varchar(max)
set @joined = ''

select  @joined = @joined + IsNull(Foo + ',', '')
from    Bar (nolock)

--; Drop last "," if necessary
set @joined = substring(@joined, 1, len(@joined) - (case when len(@joined) > 0 then 1 else 0 end))
select  @joined as foo

这看起来很优雅,但速度很慢。一个字符串通常不包含数百万条记录。对于最有可能出现的十几条记录,它将在一瞬间工作。在我的情况下,这将只应用于少数记录,并且它可以用作select语句中的子查询,这对我来说最为有效。这看起来很优雅,但相当缓慢。关联字符串通常不包含数百万条记录。对于十来条最有可能出现在那里的记录,它将在一瞬间工作。在我的情况下,这将只应用于少数记录,并且它可以用作select语句中的子查询,这对我来说最为有效。