2012-03-15 25 views
10

basit bir sorgu şu şekilde olduğunu varsayalım: Biz sonuç kümesindeki bir kayıt varsaAralarında virgülle T-SQL sonuçlarının bir listesi nasıl yapılır?

SELECT x 
FROM t 
WHERE t.y = z 

, bunu bir değere değişken @v ayarlamak istiyorum. İki veya daha fazla kayıt varsa, sonuçların virgül ve boşlukla ayrılmasını isterim. Bu T-SQL kodunu yazmanın en iyi yolu nedir?

Örnek:

sonuç kümesi 1 rekor: 2 kayıtlarının

Value1 

sonuç kümesi: 3 kayıtlarının

Value1, Value2 

sonuç kümesi:

Value1, Value2, Value3 
+0

'Ne iyi yoldur' "En iyi" özneldir .. aradığınız şeylere bağlıdır. Daha spesifik olabilir misin? Tamamen T-SQL'de * yapılmasına * gerek yoksa istemcide bir çözüm kullanabilir misiniz? –

+0

Bu geçerli midir? http://stackoverflow.com/questions/1048209/concatenating-column-values-into-a-comma-separated-list – MatthewMartin

+0

Sadece bu amaç için genel bir işlev yazmak istiyorum .. normalde bunları .NET'de ele alıyorum sonuçları elde ettikten sonra kod, ancak SQL – MacGyver

cevap

9

bu size virgül değer listesini verecektir listesini

nasıl böyle bir şey hakkında
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 Bunu yapmak için XML kullanabilir:

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; 

Diğer seçenekler için check out Concatenating Row Values in SQL.

+0

+ 1, bu çalışır. Eğer son virgül kaldırmak istiyorsanız sadece seçin LEFT (@v, Len (@v) -1) – kd7

+0

@ kd7 Teşekkürler - Ben bunu düzenleyeceğim. Aslında '- 2', çünkü değer ' 'virgül + boşluk. – Yuck

1

ayrılmış ??? SQL Server 2008 olduğuna göre

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

, XML İÇİN kullanabilirsiniz:

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

XML PATH ('') XML olarak tablo seçer, ancak boş bir yol ile İÇİN. substring (seçmek, 2, 2000000) lider ''

1

Bunun için bir özyinelemeli CTE kullanabilirsiniz kaldırır:?

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