2012-03-15 9 views
10

Supongamos que tenemos una consulta simple como esto:¿Cómo hacer una lista de resultados de T-SQL con coma entre ellos?

SELECT x 
FROM t 
WHERE t.y = z 

Si tenemos un registro en el conjunto de resultados, lo que desee establecer la variable @v a que un valor. Si tenemos dos o más registros, me gustaría que los resultados estén separados por una coma y un espacio. ¿Cuál es la mejor manera de escribir este código T-SQL?

Ejemplo:

conjunto de resultados de 1 registro:

Value1 

conjunto de resultados de 2 registros:

Value1, Value2 

resultado conjunto de 3 registros:

Value1, Value2, Value3 
+0

'¿Cuál es la mejor manera de' "mejor" es subjetivo .. Depende de qué cosas estás buscando. ¿Puedes ser mas específico? ¿Es * necesario * que se haga completamente en T-SQL o podría usar una solución en el cliente? –

+0

¿Esto aplica? http://stackoverflow.com/questions/1048209/concatenating-column-values-into-a-comma-separated-list – MatthewMartin

+0

Solo quiero escribir una función genérica para este propósito ... Normalmente los manejo en .NET código después de obtener los resultados, pero me gustaría hacerlo en SQL – MacGyver

Respuesta

9

esto le dará la lista de valores en una lista separada por comas

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

Usted puede usar XML para hacer eso:

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; 

Para otras opciones echa un vistazo a Concatenating Row Values in SQL.

+0

+1, esto funciona. Si desea eliminar la última coma, simplemente seleccione Seleccionar IZQUIERDA (@v, Len (@v) -1) – kd7

+0

@ kd7 Gracias - Voy a editar eso. Sin embargo, en realidad es '- 2', ya que el valor es', 'que es coma + espacio. – Yuck

1

¿Qué tal algo como esto separados ???

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

Ya que es SQL Server 2008, puede utilizar FOR XML:

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

para la ruta XML ('') selecciona la tabla como XML, pero con una ruta en blanco. la subcadena (seleccionar, 2, 2000000) elimina el líder ''

1

Se puede usar un CTE recursiva para esto:?

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 
Cuestiones relacionadas