2010-03-02 12 views
7

Possible Duplicate:
SQL Server: Can I Comma Delimit Multiple Rows Into One Column?Abfrageergebnis zu einer einzigen Zeile von Werten durch Komma getrennt Join

Ich habe eine Abfrage wie folgt aus:

SELECT name from users 

und es ergibt sich eine Anzahl von Datensätzen:

1 user1 
2 user2 
3 user3 

ich möchte alle diese Datensätze in einer einzigen Zeile durch Komma getrennt erhalten:

user1, user2, user3 

und eine leere Zeile, wenn Abfrage-Ergebnis ist leer.

Wie dies T-SQL mit bekommen? UNPIVOT?

+1

@OMG: Ablehnen, weil Antworten sehr unterschiedlich sind – abatishchev

Antwort

17

können Sie die COALESCE-Funktion verwenden, um dies zu erreichen:

declare @result varchar(max) 

select @result = COALESCE(@result + ', ', '') + name 
from users 

select @result 

Diese in SQL Server 2000 arbeiten und später (wahrscheinlich frühere Versionen auch). Beachten Sie, dass Sie in Sql Server 2000 nicht varchar (max) haben.

In späteren Versionen von SQL Server (2005 und später), ist es auch möglich, diese unter Verwendung von XML-Pfad zu tun()

select name + ',' 
from users 
for xml path('') 
+0

@David Hall: Ich mag die erste. Zweitens fügt ein Komma am Ende jedes Datensatzes hinzu, auch für den letzten. – abatishchev

+1

@abatiishchev froh, dass Sie das hilfreich fanden. haben Sie einen Blick auf diesen Beitrag http://msmvps.com/blogs/robfarley/archive/2007/04/08/coalesce-is-not-the-answer-to-string-concatentation-in-t-sql.aspx Sie können feststellen, dass die XML-Pfadmethode für große Ergebnismengen besser ist. –

+0

Dies ist einfach, wenn Sie nur bestimmte Datenmengen haben. Wenn Sie jedoch wollen nur einen Teil der Daten, sagt nur „user1 und user2“ - dies mit Fehlern fehlschlagen wird: ** Unterabfrage gab mehr als 1 Wert. Dies ist nicht zulässig, wenn die Unterabfrage folgt =,! =, <, <= , >,> = oder wenn die Unterabfrage als Ausdruck verwendet wird. ** –

0
declare @result varchar(max) 
set @result = '' 
select @result = @result + name + ',' from users 
if @result <> '' set @result = left(@result,len(@result)-1) 
print @result 
+0

@DyingCactus: Wie diese rekursiv in Zyklus nennen so resultierenden String wie 'user1, user2, user3, ... usern' könnte komm raus – abatishchev

+0

Meinst du wie man den String ohne Komma an bekommt in einer Aussage enden? David Halls Antwort wird das tun. – DyingCactus

1

Sie können es tun, wie diese auch außer es ist nicht formatierte alles, was schön, wenn angezeigt Shell DOS:

echo Batch file SQL 2005 
echo. 
"%PROGRAMFILES%\Microsoft SQL Server\90\Tools\BINN\osql" -S . -E -Q "SELECT name + ', ' FROM sysdatabases order by name for XML PATH('')" 
Verwandte Themen