如何连接连续的单元格?

时间:2015-02-27 20:27:27

标签: sql-server

如何将多行连接到varchar有很多问题,但是你可以将一行中的所有单元连接成一个varchar吗?

示例:包含3列的表

| Id | FirstName | LastName |
| 1  | John      | Doe      |
| 2  | Erik      | Foo      |

返回以下内容

"1, John, Doe"
"2, Erik, Foo"

你知道你在做什么表。

注1:假设您在编写查询时不知道列的名称 注2:我想避免使用动态SQL(如果可能)

2 个答案:

答案 0 :(得分:1)

我唯一想到的是设置nocount以使用这些参数将结果输出到文本而不是网格。这可以在不知道列数量和避免动态SQL的情况下完成。

Result to Text parameters

SET NOCOUNT ON;

;WITH Test (Id, FirstName, LastName)
AS (
    SELECT 1, 'John', 'Doe'
    UNION ALL
    SELECT 2, 'Erik', 'Foo'
)
SELECT *
FROM Test

会回复你:

1,John,Doe
2,Erik,Foo

答案 1 :(得分:1)

以下是此版本的基本版本。当列未知时将其转换为动态sql解决方案将非常棘手。您将需要使用sql动态生成类似于此的查询。任何没有主键或唯一索引的表几乎是不可能的,因为您不知道要用作哪个列作为您的组。它也变得更加棘手,因为你不知道你正在使用什么数据类型。您还需要确保添加一些逻辑来处理单引号和NULL。这肯定是一个有趣的挑战。如果我这个周末有时间,我可能会尝试为此动态版本做些什么。

with Something(Id, FirstName, LastName) as
(
    select 1, 'John', 'Doe' union all
    select 2, 'Erik', 'Foo'
)

select STUFF((select cast(s2.Id as varchar(5)) + ', ' + s2.FirstName + ', ' + s2.LastName
        from Something s2
        where s2.Id = s.Id
        for xml path('')), 1, 0, '') as Stuffed
from Something s
group by Id