2011-01-25 11 views
6

Na SQL Server 2008 próbuję uzyskać rozdzielaną przecinkami listę wszystkich wybranych wartości do zmiennej.Skonwersuj wartości sql do zmiennej

SELECT field 
FROM table 

powraca:

+-------+ 
| field | 
+-------+ 
| foo | 
+-------+ 
| bar | 
+-------+ 

chciałbym dostać: "foo, bar,"

Próbowałem:

DECLARE @foo NVARCHAR(MAX) 
SET @foo = '' 

SELECT @foo = @foo + field + ',' 
FROM TABLE 

PRINT @foo 

Które zwraca nic. Co ja robię źle?

+2

Czy Twoja tabela zawiera jakiekolwiek wartości NULL? –

Odpowiedz

8

Musisz zmienić null

SELECT @foo = @foo + ISNULL(field + ',', '') 
FROM TABLE 

lub usunąć je

SELECT @foo = @foo + field + ',' 
FROM TABLE 
WHERE field IS NOT NULL 
+1

O, drogie, anonimowe ... – gbn

+0

Chciałbym móc powtórzyć, ponieważ jest to doskonała odpowiedź. – VoodooChild

3

Dzieje się tak, jeśli w tabeli znajduje się JUŻ POJEDYNCZE pole o wartości NULL. W SQL Server, NULL + <any> = NULL. Albo pominąć je

SELECT @foo = @foo + field + ',' 
FROM TABLE 
WHERE field is not null 

lub pracy wokół nich

SELECT @foo = @foo + isnull(field + ',', '') 
FROM TABLE 

Można napisać całą rzecz bez wiodącego instrukcji SET, który jest bardziej powszechne. Poniżej ta kwerenda zwraca „foo bar” bez spływu przecinek

DECLARE @foo NVARCHAR(MAX) 
SELECT @foo = isnull(@foo + ',', '') + field 
FROM TABLE 
WHERE field is not null 

PRINT @foo 
+0

Nie polecam stosowania tego podejścia, ponieważ jest niewiarygodne. Więcej informacji [Plan wykonania i wyniki zagregowanych zapytań dotyczących konkatenacji zależą od lokalizacji wyrażenia] (https://support.microsoft.com/en-us/kb/287515) oraz [nvarchar concatenation/index/nvarchar (max) niewytłumaczalne zachowanie] (http://stackoverflow.com/questions/15138593/nvarchar-concatenation-index-nvarcharmax-inexplicable-behavior) – lad2025

+0

Działa to w 100% niezawodnie w przedstawionych formularzach, tj. bez ORDER BY. Bez zamówienia wartość zmiennej stale rośnie, a po zakończeniu przetwarzania pozostaje ona wynikiem końcowym. Kiedy ORDER BY wchodzi w grę, wykonanie zapytania jest zmuszone do zachowania wirtualnego zestawu danych tymczasowych z pewną przejściową wartością '@ var' w każdym wierszu. Po złożeniu zamówienia w tych "przejściowych wierszach", pewna historyczna wersja stanu '@ zmienna" zostaje odciśnięta jako ostateczna wartość przypisania. Morał z tej historii to - nie używaj ORDER BY, ani nie używaj FOR XML. – RichardTheKiwi

1

Nie zapomnij użyć LTRIM i RTRIM około @foo (gdy typem danych jest char/varchar) w konkatenacji inne nie daje oczekiwanego wyniku ts w SQL 2008 R2.

Powiązane problemy