2008-10-07 10 views
34

Im Moment habe ich eine SQL-Abfrage wie diese:Wie kann ich mehrere Zeilen in einer durch Kommas getrennten Liste in SQL Server 2005 kombinieren?

SELECT X, Y FROM POINTS 

Es gibt Ergebnisse wie folgt:

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

Ich mag würde Ergebnisse zurückgeben alle in einer Reihe, wie diese (geeignet in einem HTML-<AREA> Tag für die Nutzung):

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

gibt es eine Möglichkeit, dies nur mit SQL zu tun?

+0

Wenn Sie Ihre Anwendung skalieren möchten, ist es möglich Es ist besser, diese Art von Dingen außerhalb der Datenbank zu machen. Die Datenbank wird fast immer Ihr Flaschenhals sein. –

+0

Ich frage mich, warum die gute Antwort wegging? –

+0

@Joseph Bui - Glaub mir, ich weiß. Leider besteht der Projektleiter darauf, dass ich es so mache. –

Antwort

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

Ist es mir oder funktioniert das nicht auf einem Verbindungsserver? Wenn ich etwas wie 'SELECT @List = @List + CONVERT (varchar, ID) + ',' VON LinkedServer.MyDatabase.dbo.MyTable' versuche, gibt es immer nur eine ID zurück. Ein 'Select *' gibt viele IDs zurück. – Martin

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

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

SELECT @s 

einfach loswerden der führenden Komma

+0

Das wird das führende Komma nicht los, obwohl ......? – rainabba

59

Danke für die schnelle und hilfreiche Antworten Jungs!

Ich habe gerade einen anderen schnellen Weg, dies zu tun:

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

Kredit dieser Kerl geht:

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

+0

Ich mag diese Lösung am meisten. Einfach zu bedienen und nur eine Zeile in jedem SQL hinzuzufügen. –

+0

Awesome, es hat gut für mich funktioniert –

9

Mit dem COALESCE Trick, müssen Sie sich keine Sorgen darüber, das nachgestellte Komma:

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

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

Das auf der anderen Seite funktioniert super! – rainabba

Verwandte Themen