Sql server 如何将单元格连接成一行?

Sql server 如何将单元格连接成一行?,sql-server,Sql Server,如何将多行连接成一个varchar有很多问题,但是能否将一行中的所有单元格连接成一个varchar 示例:包含3列的表 | Id | FirstName | LastName | | 1 | John | Doe | | 2 | Erik | Foo | 返回以下内容 "1, John, Doe" "2, Erik, Foo" 您知道您正在处理哪个表 注1:假设您在编写查询时不知道列的名称。 注2:我想避免使用动态SQL(如果可能的话)我唯一能想到

如何将多行连接成一个varchar有很多问题,但是能否将一行中的所有单元格连接成一个varchar

示例:包含3列的表

| Id | FirstName | LastName |
| 1  | John      | Doe      |
| 2  | Erik      | Foo      |
返回以下内容

"1, John, Doe"
"2, Erik, Foo"
您知道您正在处理哪个表

注1:假设您在编写查询时不知道列的名称。

注2:我想避免使用动态SQL(如果可能的话)

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

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

这是这个的基本版本。当列未知时,将其转换为动态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

那么,您希望将值或列名连接起来吗?我认为,当您不知道表中有哪些列时,不可能避免使用动态SQL。不,如果假设您不知道列名,则不可能避免使用动态SQL。您真正想做的是什么?将所有列填充到一个结果中表明,可能有更好的方法来完成您尝试执行的任何操作。删除了“无动态sql”要求。