2010-04-18 8 views
2

Comment faire une boucle dans une instruction select pour obtenir un texte formaté? par exemple, la sélection est comme:Comment formater la sortie TSQL SELECT dans SQL Server

select name from table 

et nous voulons une @names variables comme celui-ci:

"name1,name2,name3" 

Database est SQL Server 2005

+1

@mohamadreza, en fonction de votre commentaire que vous avez l'intention d'envelopper cette http: // stackoverflow. com/questions/2661437/comment-format-tsql-select-sortie-dans-sql-sever/2661475 # 2661475 dans une fonction. Cependant, si vous le faites et que vous l'utilisez dans une liste de sélection d'une requête, ce sera très inefficace. Il existe de bien meilleures façons de gérer cela, voir ma réponse pour un exemple de comment. –

Répondre

5

Si la table contient plusieurs enregistrements, i.e. .:

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

alors cette requête:

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

produira résultat suivant:

name1, name2, name3 

Voir COALESCE on MSDN

+0

C'est exactement ce dont j'ai besoin. Merci. aussi varchar (max) ne peut pas être utilisé pour un argument de fonction sql donc j'ai utilisé varchar (500) par exemple – mohamadreza

1

Cela devrait être fait dans une fonction . Il n'y a pas de moyen rapide de faire ça. Normalement, vous le feriez dans votre code client.

1

Si vous envisagez de faire une fonction que vous faites sur chaque ligne à partir d'une autre requête, il sera vraiment lent, car la fonction doit être appelée pour chaque ligne. Vous devriez travailler avec des ensembles de données à la fois, il fait toutes les lignes en même temps. Ceci est un exemple de la façon de concaténer plusieurs valeurs pour chaque ligne d'une autre requête:

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 

SORTIE:

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