2012-03-15 9 views
10

Załóżmy, że mamy proste zapytanie tak:Jak utworzyć listę wyników T-SQL z przecinkiem między nimi?

SELECT x 
FROM t 
WHERE t.y = z 

Jeśli mamy jeden rekord w tabeli wynikowej, chcę ustawić zmienną @v do tej jednej wartości. Jeśli mamy dwa lub więcej rekordów, chciałbym, aby wyniki były rozdzielone przecinkiem i spacją. Jaki jest najlepszy sposób napisania tego kodu T-SQL?

Przykład:

zestaw wynikiem 1 rekord:

Value1 

wynik zestaw 2 płyt:

Value1, Value2 

wynik zestaw 3 płyt:

Value1, Value2, Value3 
+0

'Co jest najlepszym sposobem' "Najlepsza" jest subiektywna .. zależy od tego, czego szukasz. Czy mógłbyś to sprecyzować? Czy * trzeba * wykonywać całkowicie w T-SQL lub czy można użyć rozwiązania na kliencie? –

+0

Czy to dotyczy? http://stackoverflow.com/questions/1048209/concatenating-column-values-into-a-comma-separated-list – MatthewMartin

+0

Po prostu chcę napisać ogólną funkcję do tego celu. zwykle obsługuję je w .NET kod po uzyskaniu wyników, ale chciałbym zrobić to w SQL – MacGyver

Odpowiedz

9

to daje listę wartości oddzielone przecinkami w listę

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

You do tego celu można użyć XML:

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; 

W przypadku innych opcji zobacz Concatenating Row Values in SQL.

+0

+1, to działa. Jeśli chcesz usunąć ostatni przecinek, po prostu wybierz LEWO (@v, Len (@v) -1) – kd7

+0

@ kd7 Dzięki - dokonam edycji. Jest to jednak '- 2', ponieważ wartość to', 'który jest przecinkiem + spacja. – Yuck

1

Jak o coś takiego ???

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

Ponieważ jest to SQL Server 2008, można użyć dla XML:

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

dla ścieżki XML ('') wybiera tabelę jako XML, ale z pustej drodze. podciąg (Proszę zaznaczyć, 2, 2000000) usuwa wiodącą ''

1

Można użyć rekurencyjnej CTE na to:

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 
Powiązane problemy