2008-10-07 7 views
34

En ce moment, j'ai une requête SQL comme celui-ci:Comment puis-je combiner plusieurs lignes dans une liste délimitée par des virgules dans SQL Server 2005?

SELECT X, Y FROM POINTS 

Il renvoie des résultats comme si:

X Y 
---------- 
12 3 
15 2 
18 12 
20 29 

Je voudrais retourner des résultats en une seule rangée, comme celui-ci (approprié pour l'utilisation dans un HTML <ZONE> tag):

XYLIST 
---------- 
12,3,15,2,18,12,20,29 

Est-il possible de le faire en utilisant seulement SQL?

+0

Si vous voulez que votre application à l'échelle, il wo Il serait préférable de faire ce genre de chose en dehors de la base de données. La base de données sera presque toujours votre goulot d'étranglement. –

+0

Je me demande pourquoi la bonne réponse est partie? –

+0

@Joseph Bui - Croyez-moi, je sais. Malheureusement, le chef de projet insiste pour que je le fasse de cette façon. –

Répondre

22
DECLARE @XYList varchar(MAX) 
SET @XYList = '' 

SELECT @XYList = @XYList + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y) + ',' 
FROM POINTS 

-- Remove last comma 
SELECT LEFT(@XYList, LEN(@XYList) - 1) 
+0

Est-ce moi ou ne fonctionne pas sur un serveur lié? Lorsque j'essaie quelque chose comme 'SELECT @List = @List + CONVERT (varchar, ID) + ',' FROM LinkedServer.MyDatabase.dbo.MyTable' il retourne toujours un seul ID. Un 'Select *' renvoie plusieurs ID. – Martin

1
DECLARE @s VarChar(8000) 
SET @s = '' 

SELECT @s = @s + ',' + CAST(X AS VarChar) + ',' + CAST(Y AS VarChar) 
FROM POINTS 

SELECT @s 

Il suffit de se débarrasser des principales virgule

+0

Cela ne se débarrasse pas de la virgule bien si ......? – rainabba

59

Merci pour les gars rapides et réponses utiles!

Je viens de trouver un autre moyen rapide de faire cela aussi:

SELECT STUFF((SELECT ',' + X + ',' + Y 
       FROM Points 
       FOR 
       XML PATH('') 
      ), 1, 1, '') AS XYList 

Le crédit va à ce type:

http://geekswithblogs.net/mnf/archive/2007/10/02/t-sql-user-defined-function-to-concatenate-column-to-csv-string.aspx

+0

J'aime vraiment beaucoup cette solution. Facile à utiliser et une seule ligne à ajouter dans n'importe quel SQL. –

+0

Génial, cela a bien fonctionné pour moi –

9

En utilisant l'astuce COALESCE, vous n'avez pas à vous soucier la virgule de fin:

DECLARE @XYList AS varchar(MAX) -- Leave as NULL 

SELECT @XYList = COALESCE(@XYList + ',', '') + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y) 
FROM POINTS 
+0

Cela fonctionne d'autre part très bien! – rainabba

Questions connexes