2010-03-02 11 views
7

Possible Duplicate:
SQL Server: Can I Comma Delimit Multiple Rows Into One Column?Únete resultado de la consulta a una sola línea de valores separados por comas

tengo una consulta como esta:

SELECT name from users 

y es resultado es una serie de registros:

1 user1 
2 user2 
3 user3 

Quiero obtener todos estos registros en una sola línea separados por comas:

user1, user2, user3 

y una línea vacía si el resultado de la consulta está vacío.

¿Cómo se obtiene usando T-SQL? UNPIVOT?

+1

@OMG: en desacuerdo porque las respuestas son muy diferentes – abatishchev

Respuesta

17

Puede utilizar la función de unirse para lograr esto:

declare @result varchar(max) 

select @result = COALESCE(@result + ', ', '') + name 
from users 

select @result 

Esto funciona en SQL Server 2000 y versiones posteriores (probablemente versiones anteriores también). Sin embargo, tenga en cuenta que no tiene varchar (max) en el servidor sql 2000.

En versiones posteriores de SQL Server (2005 y posteriores), también es posible hacer esto usando XML Path()

select name + ',' 
from users 
for xml path('') 
+0

@David Hall: me gusta el primero. La segunda desafortunadamente agrega una coma al final de cada registro, para el último también. – abatishchev

+1

@abatishchev me alegra que haya encontrado esto útil. Eche un vistazo a esta publicación http://msmvps.com/blogs/robfarley/archive/2007/04/08/coalesce-is-not-the-answer-to-string-concatentation-in-t-sql.aspx puede encontrar que para grandes conjuntos de resultados, el método de ruta xml es mejor. –

+0

Esto es fácil cuando solo tiene cierta cantidad de datos. Sin embargo, si solo desea una parte de los datos, solo diga "usuario1 y usuario2"; esto generará el error: ** La subconsulta arrojó más de 1 valor. Esto no está permitido cuando la subconsulta sigue =,! =, <, <= , >,> = o cuando la subconsulta se usa como una expresión. ** –

0
declare @result varchar(max) 
set @result = '' 
select @result = @result + name + ',' from users 
if @result <> '' set @result = left(@result,len(@result)-1) 
print @result 
+0

@DyingCactus: Cómo llamar a esto en el ciclo de forma recursiva por lo que resulta cadena como 'usuario1, usuario2, usuario3, ... usern' podría salir – abatishchev

+0

¿Quiere decir cómo obtener la cadena sin coma en terminar en una declaración? La respuesta de David Hall hará eso. – DyingCactus

1

Usted puede hacerlo de esta manera también, excepto que no es formateado todo lo que muy bien cuando que se muestra a la shell de DOS:

echo Batch file SQL 2005 
echo. 
"%PROGRAMFILES%\Microsoft SQL Server\90\Tools\BINN\osql" -S . -E -Q "SELECT name + ', ' FROM sysdatabases order by name for XML PATH('')" 
Cuestiones relacionadas