varias unir una resultado registros numeros filas consultas consulta concatenar columna campos sql sql-server tsql sql-function

unir - Consulta SQL-Concatenando resultados en una cadena



concatenar varias filas en una columna sql server 2008 (6)

Aquí hay otro ejemplo de la vida real que funciona bien al menos con la versión 2008 (y posterior).

Esta es la consulta original que usa simple max() para obtener al menos uno de los valores:

SELECT option_name, Field_M3_name, max(Option_value) AS "Option value", max(Sorting) AS "Sorted" FROM Value_list group by Option_name, Field_M3_name ORDER BY option_name, Field_M3_name

Versión mejorada, donde la principal mejora es que mostramos todos los valores separados por comas:

SELECT from1.keys, from1.option_name, from1.Field_M3_name, Stuff((SELECT DISTINCT '', '' + [Option_value] FROM Value_list from2 WHERE COALESCE(from2.Option_name,'''') + ''|'' + COALESCE(from2.Field_M3_name,'''') = from1.keys FOR XML PATH(''''),TYPE) .value(''text()[1]'',''nvarchar(max)''),1,2,N'''') AS "Option values", Stuff((SELECT DISTINCT '', '' + CAST([Sorting] AS VARCHAR) FROM Value_list from2 WHERE COALESCE(from2.Option_name,'''') + ''|'' + COALESCE(from2.Field_M3_name,'''') = from1.keys FOR XML PATH(''''),TYPE) .value(''text()[1]'',''nvarchar(max)''),1,2,N'''') AS "Sorting" FROM ((SELECT DISTINCT COALESCE(Option_name,'''') + ''|'' + COALESCE(Field_M3_name,'''') AS keys, Option_name, Field_M3_name FROM Value_list) -- WHERE ) from1 ORDER BY keys

Tenga en cuenta que hemos resuelto todos los posibles problemas de caso NULL que puedo pensar y también hemos solucionado un error que obtuvimos para los valores numéricos (selección de campo).

Tengo una función sql que incluye este código:

DECLARE @CodeNameString varchar(100) SELECT CodeName FROM AccountCodes ORDER BY Sort

Necesito concatenar todos los resultados de la consulta de selección en CodeNameString.

Obviamente, un bucle FOREACH en el código C # haría esto, pero ¿cómo lo hago en SQL?


La respuesta de @ AlexanderMP es correcta, pero también puede considerar el manejo de nulos con coalesce :

declare @CodeNameString nvarchar(max) set @CodeNameString = null SELECT @CodeNameString = Coalesce(@CodeNameString + '', '', '''') + cast(CodeName as varchar) from AccountCodes select @CodeNameString


Para SQL Server 2005 y Coalesce posteriores, use Coalesce para nulls y estoy usando Cast o Convert si hay numeric values -

declare @CodeNameString nvarchar(max) select @CodeNameString = COALESCE(@CodeNameString + '','', '''') + Cast(CodeName as varchar) from AccountCodes ORDER BY Sort select @CodeNameString


Si está en SQL Server 2005 o superior, puede utilizar este truco FOR XML PATH & STUFF :

DECLARE @CodeNameString varchar(100) SELECT @CodeNameString = STUFF( (SELECT '','' + CodeName FROM dbo.AccountCodes ORDER BY Sort FOR XML PATH('''')), 1, 1, '''')

FOR XML PATH('''') básicamente concatena sus cadenas en un solo resultado XML largo (algo así como ,code1,code2,code3 etc.) y el STUFF pone un carácter "nada" en el primer carácter, por ejemplo, borra el " superflua "primera coma, para darle el resultado que probablemente esté buscando.

ACTUALIZAR: OK - Entiendo los comentarios: si su texto en la tabla de la base de datos ya contiene caracteres como < , > o & , entonces mi solución actual de hecho los codificará en &lt; , &gt; y &amp; .

Si tiene un problema con esa codificación XML, entonces sí, debe ver la solución propuesta por @KM que también funciona para esos personajes. Una palabra de advertencia mía: este enfoque requiere mucho más recursos y más procesamiento, para que lo sepas.


de msdn No utilice una variable en una instrucción SELECT para concatenar valores (es decir, para calcular valores agregados). Se pueden producir resultados de consulta inesperados. Esto se debe a que no se garantiza que todas las expresiones de la lista SELECT (incluidas las asignaciones) se ejecuten exactamente una vez por cada fila de salida

Lo anterior parece decir que la concatenación como se hizo arriba no es válida, ya que la asignación se puede hacer más veces que las filas devueltas por la selección


DECLARE @CodeNameString varchar(max) SET @CodeNameString='''' SELECT @CodeNameString=@CodeNameString+CodeName FROM AccountCodes ORDER BY Sort SELECT @CodeNameString