2010-04-18 74 views
2

如何通过select语句循环结果以获得格式化文本? 例如选择是这样的:如何在SQL Sever中格式化TSQL SELECT输出

select name from table 

,我们希望有一个变量@names这样的:

"name1,name2,name3" 

数据库是SQL Server 2005中

+1

@mohamadreza,根据您的评论你打算换此http://计算器。/2661437/how-to-format-tsql-select-output-in-sql-sever/2661475#2661475在一个函数中。但是,如果你这样做,并且你在查询的选择列表中使用它,它将是非常低效的。有很多更好的方法来处理这个问题,请参阅我的答案,了解一个例子。 – 2010-04-19 13:49:54

回答

5

如果表中包含多个记录,即:

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

那么这个查询:

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

会产生一个结果:

name1, name2, name3 

COALESCE on MSDN

+0

这正是我需要的。谢谢。也varchar(max)不能用于一个SQL函数参数,所以我用varchar(500)为例 – mohamadreza 2010-04-18 08:00:49

1

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

1

如果你打算在每一行上做一个函数来形成另一个查询,它会很慢,因为需要为每一行调用该函数。您应该一次处理一组数据,它一次处理所有行。这是如何连接多个值再查询的每一行的例子:

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 

OUTPUT:

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