Estoy tratando de migrar una aplicación basada en MySQL a Microsoft SQL Server 2005 (no por elección, pero así es la vida).
En la aplicación original, utilizamos casi completamente declaraciones compatibles con ANSI-SQL, con una excepción significativa: utilizamos la group_concat
función de MySQL con bastante frecuencia.
group_concat
, por cierto, hace esto: dada una tabla de, por ejemplo, nombres de empleados y proyectos ...
SELECT empName, projID FROM project_members;
devoluciones:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
... y esto es lo que obtienes con group_concat:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
devoluciones:
ANDY | A100 / B391 / X010
TOM | A100 / A510
Entonces, lo que me gustaría saber es: ¿es posible escribir, por ejemplo, una función definida por el usuario en SQL Server que emule la funcionalidad de group_concat
?
Casi no tengo experiencia en el uso de UDF, procedimientos almacenados o algo por el estilo, solo SQL directo, así que por favor cometa demasiadas explicaciones :)
Respuestas:
No hay una manera REAL de hacer esto. Sin embargo, hay muchas ideas por ahí.
El mejor que he encontrado :
O una versión que funciona correctamente si los datos pueden contener caracteres como
<
fuente
Puede que llegue un poco tarde a la fiesta, pero este método funciona para mí y es más fácil que el método COALESCE.
fuente
Posiblemente demasiado tarde para ser beneficioso ahora, pero ¿no es esta la forma más fácil de hacer las cosas?
fuente
SQL Server 2017 introduce una nueva función agregada
STRING_AGG ( expression, separator)
.Los elementos concatenados se pueden ordenar agregando
WITHIN GROUP (ORDER BY some_expression)
Para las versiones 2005-2016 , generalmente uso el método XML en la respuesta aceptada.
Sin embargo, esto puede fallar en algunas circunstancias. por ejemplo, si los datos que se concatenarán contienen
CHAR(29)
, veráUn método más robusto que pueda manejar todos los caracteres sería usar un agregado CLR. Sin embargo, aplicar un orden a los elementos concatenados es más difícil con este enfoque.
El método de asignación a una variable no está garantizado y debe evitarse en el código de producción.
fuente
Echa un vistazo al proyecto GROUP_CONCAT en Github, creo que hago exactamente lo que estás buscando:
fuente
GROUP_CONCAT(klascode,'(',name,')' ORDER BY klascode ASC SEPARATOR ', ')
Para concatenar todos los nombres de gerentes de proyecto de proyectos que tienen múltiples gerentes de proyecto, escriba:
fuente
Con el siguiente código, debe establecer PermissionLevel = External en las propiedades de su proyecto antes de implementarlo, y cambiar la base de datos para confiar en el código externo (asegúrese de leer en otro lugar sobre riesgos de seguridad y alternativas [como certificados]) ejecutando "ALTER DATABASE database_name SET CONFIABLE EN ".
He probado esto usando una consulta que se parece a:
Y rendimientos: A, B, C, D
fuente
Intenté esto, pero para mis propósitos en MS SQL Server 2005, lo siguiente fue más útil, lo que encontré en xaprb
@Mark como mencionaste, fue el personaje espacial el que me causó problemas.
fuente
Sobre la respuesta de J Hardiman, ¿qué tal:
Por cierto, ¿el uso de "Apellido" es un error tipográfico o no estoy entendiendo un concepto aquí?
De todos modos, muchas gracias chicos porque me ahorró bastante tiempo :)
fuente
Para mis compañeros de Google, hay una solución plug-and-play muy simple que funcionó para mí después de luchar por un tiempo con las soluciones más complejas:
Tenga en cuenta que tuve que convertir el ID en un VARCHAR para concatenarlo como una cadena. Si no tiene que hacer eso, aquí hay una versión aún más simple:
Todo el crédito para esto va aquí: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9508abc2-46e7-4186-b57f-7f368374e084/replicating-groupconcat-function-of-mysql-in- sql-server? forum = transactsql
fuente