2012-03-15 9 views
10

Supponiamo di avere una semplice query come questa:Come creare un elenco di risultati T-SQL con una virgola tra di loro?

SELECT x 
FROM t 
WHERE t.y = z 

Se abbiamo un record nel set di risultati, voglio impostare la variabile @v a quello valore. Se abbiamo due o più record, mi piacerebbe che i risultati fossero separati da una virgola e uno spazio. Qual è il modo migliore per scrivere questo codice T-SQL?

Esempio:

set di risultati di 1 registro:

Value1 

risultato set di 2 record:

Value1, Value2 

risultato set di 3 record:

Value1, Value2, Value3 
+0

'Qual è il modo migliore' "Best" è soggettivo .. dipende da quali cose stai cercando. Può essere più preciso? Ha * bisogno * di essere fatto interamente in T-SQL o potresti usare una soluzione sul client? –

+0

Questo si applica? http://stackoverflow.com/questions/1048209/concatenating-column-values-into-a-comma-separated-list – MatthewMartin

+0

Sto solo volendo scrivere una funzione generica per questo scopo .. normalmente li gestisco in .NET codice dopo aver ottenuto i risultati, ma mi piacerebbe farlo in SQL – MacGyver

risposta

9

questo vi darà l'elenco dei valori in virgola lista

create table #temp 
(
    y int, 
    x varchar(10) 
) 

insert into #temp values (1, 'value 1') 
insert into #temp values (1, 'value 2') 
insert into #temp values (1, 'value 3') 
insert into #temp values (1, 'value 4') 

DECLARE @listStr varchar(255) 

SELECT @listStr = COALESCE(@listStr+', ', '') + x 
FROM #temp 
WHERE #temp.y = 1 

SELECT @listStr as List 

drop table #temp 
9

È puoi usare XML per farlo:

DECLARE @V VarChar(4000); 

SELECT @V = CONVERT(VarChar(4000), (
    SELECT x + ', ' 
    FROM t 
    WHERE t.y = z 
    FOR XML PATH('') 
)); 
-- To remove the final , in the list: 
SELECT @V = LEFT(@V, LEN(@V) - 2); 

SELECT @V; 

Per le altre opzioni di check out Concatenating Row Values in SQL.

+0

+1, funziona. Se si desidera rimuovere l'ultima virgola, basta selezionare SINISTRA (@v, Len (@v) -1) – kd7

+0

@ kd7 Grazie - lo modificherò. In realtà è '- 2' sebbene, poiché il valore è', 'che è una virgola + spazio. – Yuck

1

Che ne dite di qualcosa di simile separati ???

DECLARE @x AS VARCHAR(2000) 
SET @x = '' 
SELECT @x = @x + RTRIM(x) + ',' 
FROM t 
SELECT @x = SUBSTRING(@x, 1, LEN(@x) - 1) 
PRINT @x 
3

Dal momento che è SQL Server 2008, è possibile utilizzare FOR XML:

SELECT SUBSTRING(
    (SELECT ',' + t.x 
    FROM t 
    WHERE t.y = z 
    FOR XML PATH('')), 
    2, 
    200000) AS CSV 

FOR XML PATH ('') seleziona il tavolo come XML, ma con un percorso vuoto. Il SUBSTRING (selezionare, 2, 2000000) rimuove il leader ''

1

Si potrebbe utilizzare una CTE ricorsiva per questo:?

CREATE TABLE #TableWithId (Id INT IDENTITY(1,1), x VARCHAR) 

INSERT INTO #TableWithId 
SELECT x 
FROM t 
WHERE t.y = z 

WITH Commas(ID, Flattened) 
AS 
(
-- Anchor member definition 
    SELECT ID, x AS Flattened 
    FROM #TableWithId 
    WHERE ID = 1 
    UNION ALL 
-- Recursive member definition 
    SELECT #TableWithId.Id, Flattened + ',' + x 
    FROM #TableWithId 
    INNER JOIN Commas 
     ON #TableWithId.Id + 1 = Commas.Id 
) 
-- Statement that executes the CTE 
SELECT TOP 1 Flattened 
FROM Commas 
ORDER BY id; 
GO 
Problemi correlati