2008-10-07 22 views
34

En este momento, tengo una consulta SQL como la siguiente:¿Cómo puedo combinar varias filas en una lista delimitada por comas en SQL Server 2005?

SELECT X, Y FROM POINTS 

Devuelve resultados de este modo:

X Y 
---------- 
12 3 
15 2 
18 12 
20 29 

que me gustaría volver resultados todos en una fila, como este (apto para usar en un archivo HTML < ÁREA > etiqueta):

XYLIST 
---------- 
12,3,15,2,18,12,20,29 

¿hay una manera de hacer esto utilizando sólo SQL?

+0

Si desea que su aplicación a escala, es wo Sería mejor hacer este tipo de cosas fuera de la base de datos. La base de datos casi siempre será tu cuello de botella. –

+0

Me pregunto por qué la buena respuesta se fue? –

+0

@Joseph Bui - Créanme, lo sé. Lamentablemente, el líder del proyecto insiste en que lo haga de esta manera. –

Respuesta

22
DECLARE @XYList varchar(MAX) 
SET @XYList = '' 

SELECT @XYList = @XYList + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y) + ',' 
FROM POINTS 

-- Remove last comma 
SELECT LEFT(@XYList, LEN(@XYList) - 1) 
+0

¿Funciono yo o no en un servidor vinculado? Cuando intento algo como 'SELECT @List = @List + CONVERT (varchar, ID) + ',' FROM LinkedServer.MyDatabase.dbo.MyTable' siempre devuelve solo una ID. Un 'Seleccionar *' devuelve muchas ID's. – Martin

1
DECLARE @s VarChar(8000) 
SET @s = '' 

SELECT @s = @s + ',' + CAST(X AS VarChar) + ',' + CAST(Y AS VarChar) 
FROM POINTS 

SELECT @s 

Deshazte de los principales coma

+0

Esto no elimina la coma principal, ¿así que ......? – rainabba

59

Gracias por los chicos y rápidas respuestas votos!

me acaba de encontrar otra forma rápida de hacer esto también:

SELECT STUFF((SELECT ',' + X + ',' + Y 
       FROM Points 
       FOR 
       XML PATH('') 
      ), 1, 1, '') AS XYList 

crédito va a este individuo:

http://geekswithblogs.net/mnf/archive/2007/10/02/t-sql-user-defined-function-to-concatenate-column-to-csv-string.aspx

+0

Me gusta mucho esta solución. Fácil de usar y solo una línea para agregar en cualquier SQL. –

+0

Impresionante, funcionó bien para mí –

9

Usando el truco COALESCE, usted no tiene que preocuparse la coma que se arrastra:

DECLARE @XYList AS varchar(MAX) -- Leave as NULL 

SELECT @XYList = COALESCE(@XYList + ',', '') + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y) 
FROM POINTS 
+0

¡Esto por otro lado funciona genial! – rainabba

Cuestiones relacionadas