2010-03-02 24 views
7

Possible Duplicate:
SQL Server: Can I Comma Delimit Multiple Rows Into One Column?Dołącz wynik kwerendy do pojedynczej linii wartości oddzielonych przecinkami

Mam kwerendy tak:

SELECT name from users 

i jest to wynik jest liczbą zapisów:

1 user1 
2 user2 
3 user3 

Chcę uzyskać wszystkie te rekordy w jednym wierszu oddzielonym przecinkiem:

user1, user2, user3 

i pusty wiersz, jeśli wynik zapytania jest pusty.

Jak uzyskać to za pomocą T-SQL? UNPIVOT?

+1

@OMG: zgadzam się, ponieważ odpowiedzi są bardzo różne – abatishchev

Odpowiedz

17

Można użyć funkcji zlewają się do osiągnięcia tego celu:

declare @result varchar(max) 

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

select @result 

ta będzie działać w serwerze SQL 2000 i później (prawdopodobnie wcześniejsze wersje też). Zauważ, że nie masz varchar (max) w serwerze sql 2000.

W późniejszych wersjach serwera SQL (2005 i później), możliwe jest również to zrobić przy użyciu XML Path()

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

@ David Hall: Lubię pierwszy. Drugi niestety dodaje przecinek na końcu każdego rekordu, także ostatniego. – abatishchev

+1

@abatishchev Cieszę się, że znalazłeś to pomocne. Zajrzyj do tego posta http://msmvps.com/blogs/robfarley/archive/2007/04/08/coalesce-is-not-the-answer-to-string-concatentation-in-t-sql.aspx może się okazać, że dla dużych zestawów wyników metoda ścieżki XML jest lepsza. –

+0

Jest to łatwe, gdy masz tylko określoną ilość danych. Jeśli jednak chcesz tylko część danych, powiedz tylko "użytkownik1 i użytkownik2" - to nie powiedzie się z powodu błędu: ** Podzapytanie zwróciło więcej niż jedną wartość. Jest to niedozwolone, gdy podzapytanie następuje po =,! =, <, <= , >,> = lub gdy podzapytanie jest używane jako wyrażenie. ** –

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: Jak nazywają to w cyklu rekurencyjnie tak powstałego łańcucha jak „user1, user2, użytkownik3 ... userN” może wyjdzie – abatishchev

+0

Masz na myśli, jak uzyskać ciąg bez przecinka w zakończyć w jednym oświadczeniu? Odpowiedź Davida Halla to zrobi. – DyingCactus

1

Można zrobić to w ten sposób za wyjątkiem jej nie sformatowany wszystko ładnie kiedy wyświetlane do powłoki 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('')" 
Powiązane problemy