【问题标题】:How to format TSQL SELECT output in SQL Sever如何在 SQL Server 中格式化 SQL SELECT 输出
【发布时间】:2010-04-18 07:16:00
【问题描述】:

如何遍历一个选择语句的结果来获得一个格式化的文本? 例如选择是这样的:

select name from table 

我们想要一个像这样的变量@names:

"name1,name2,name3"

数据库是 SQL Server 2005

【问题讨论】:

  • @mohamadreza,根据您的评论,您打算将此stackoverflow.com/questions/2661437/… 包装在一个函数中。但是,如果您这样做并且在查询的选择列表中使用它,它将非常低效。有更好的方法来处理这个问题,请参阅我的答案以获取有关如何处理的示例。

标签: sql sql-server sql-server-2005 tsql formatting


【解决方案1】:

如果表包含多条记录,即:

1, name1, ..
2, name2, ..
3, name3, ..

那么这个查询:

DECLARE @names VARCHAR(MAX)
SELECT @names = COALESCE(@names + ', ', '') + name
FROM table

将产生下一个结果:

name1, name2, name3

COALESCE on MSDN

【讨论】:

  • 这正是我所需要的。谢谢。 varchar(max) 也不能用于 sql 函数参数,所以我使用 varchar(500) 例如
【解决方案2】:

这需要在一个函数中完成。没有快速的方法可以做到这一点。通常,您会在客户端代码中执行此操作。

【讨论】:

    【解决方案3】:

    如果您打算在另一个查询中对每一行执行一个函数,那么它会非常慢,因为需要为每一行调用该函数。您应该一次处理一组数据,一次处理所有行。这是一个如何为另一个查询的每一行连接多个值的示例:

    set nocount on;
    declare @t table (id int, name varchar(20), x char(1))
    insert into @t (id, name, x)
    select 1,'test1', 'a' union
    select 1,'test1', 'b' union
    select 1,'test1', 'c' union
    select 2,'test2', 'a' union
    select 2,'test2', 'c' union
    select 3,'test3', 'b' union
    select 3,'test3', 'c' 
    
    SELECT p1.id, p1.name,
              stuff(
                       (SELECT
                            ', ' + x
                            FROM @t p2
                            WHERE p2.id=p1.id
                            ORDER BY name, x
                            FOR XML PATH('') 
                       )
                       ,1,2, ''
                   ) AS p3
          FROM @t p1
         GROUP BY 
            id, name
    

    输出:

    id          name                 p3
    ----------- -------------------- -----------
    1           test1                a, b, c
    2           test2                a, c
    3           test3                b, c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多