在T-SQL中将多个行字段连接成一列

时间:2011-01-19 19:07:21

标签: asp.net sql tsql

我正在编写一个SQL查询,其中我需要在表上执行子选择,这通常会返回多行。我需要能够将所有行中某个字段的结果连接到一个字段中才能输出。这有可能,怎么样?

例如,如果SQL查询返回

id | field
1  | test1
2  | test2
3  | test3

我需要输出的字段为“test1 test2 test3”。 感谢

5 个答案:

答案 0 :(得分:5)

这是执行此操作的for xml技巧:

    SELECT  field + ' ' as [text()]
    FROM    YourTable
    FOR XML PATH ('')

打印:

test1 test2 test3

它通常与outer apply一起使用,每行执行一次。

答案 1 :(得分:3)

declare @sample table(id int, field varchar(20))
insert into @sample values(1,'test1')
insert into @sample values(2,'test2')
insert into @sample values(3,'test3')
declare @result varchar(max) set @result = ''
select @result = @result + ' '+field from @sample
select @result

SQLCLR自定义聚合器将是一种替代(更好的读取)解决方案

答案 2 :(得分:0)

试试这个:

SELECT RTRIM(field)
  FROM (
                SELECT field + ' ' field
                    FROM <YOUR_TABLE>
                    FOR XML PATH('')
             ) a

答案 3 :(得分:0)

作为现有答案的补充。尝试将COALESCE表达式包含在您要使用的列名称中。这样可以避免在连接字符串中使用空值,并避免列表看起来像这样。注意多余的空白区域。

field1 field2   field4 field

可以找到更多详细信息here

GO

DECLARE @tableName VARCHAR(MAX)
SELECT  @tableName = COALESCE(@tableName + ' ' ,'') + Name
FROM    sys.tables
SELECT  @tableName

GO

答案 4 :(得分:-1)

可以使用光标。

declare @field nvarchar(max)
declare @concat nvarchar(max)
set @concat = ''
declare @cursor cursor
set @cursor = cursor for select field from table
open @cursor
fetch next from @cursor into @field
while @@fetch_status = 0
begin
  set @concat = concat(@concat,@field)
  fetch next from @cursor into @field
end

你的练习是在连接的字符串之间添加空格: - )