J'essaie de migrer une application basée sur MySQL vers Microsoft SQL Server 2005 (pas par choix, mais c'est la vie).
Dans l'application d'origine, nous avons utilisé presque entièrement des instructions conformes à ANSI-SQL, à une exception près: nous avons utilisé la group_concat
fonction de MySQL assez fréquemment.
group_concat
, soit dit en passant, à partir d'un tableau, disons, des noms des employés et des projets ...
SELECT empName, projID FROM project_members;
Retour:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
... et voici ce que vous obtenez avec group_concat:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
Retour:
ANDY | A100 / B391 / X010
TOM | A100 / A510
Donc, ce que je voudrais savoir, c'est: est-il possible d'écrire, par exemple, une fonction définie par l'utilisateur dans SQL Server qui émule la fonctionnalité de group_concat
?
Je n'ai presque aucune expérience en utilisant des FDU, des procédures stockées ou quelque chose comme ça, juste du SQL direct, alors veuillez vous tromper du côté de trop d'explications :)
Réponses:
Pas de VRAI moyen facile de le faire. Beaucoup d'idées cependant.
Le meilleur que j'ai trouvé :
Ou une version qui fonctionne correctement si les données peuvent contenir des caractères tels que
<
la source
Je suis peut-être un peu en retard à la fête mais cette méthode fonctionne pour moi et est plus facile que la méthode COALESCE.
la source
Peut-être trop tard pour en bénéficier maintenant, mais n'est-ce pas la façon la plus simple de faire les choses?
la source
SQL Server 2017 introduit une nouvelle fonction d'agrégation
STRING_AGG ( expression, separator)
.Les éléments concaténés peuvent être commandés en ajoutant
WITHIN GROUP (ORDER BY some_expression)
Pour les versions 2005-2016 j'utilise généralement la méthode XML dans la réponse acceptée.
Cela peut cependant échouer dans certaines circonstances. par exemple, si les données à concaténer contiennent
CHAR(29)
vous voyezUne méthode plus robuste qui peut gérer tous les caractères serait d'utiliser un agrégat CLR. Cependant, appliquer un ordre aux éléments concaténés est plus difficile avec cette approche.
La méthode d'affectation à une variable est pas garantie et doit être évitée dans le code de production.
la source
Jetez un œil au projet GROUP_CONCAT sur Github, je pense que je fais exactement ce que vous recherchez:
la source
GROUP_CONCAT(klascode,'(',name,')' ORDER BY klascode ASC SEPARATOR ', ')
Pour concaténer tous les noms de chef de projet des projets qui ont plusieurs chefs de projet, écrivez:
la source
Avec le code ci-dessous, vous devez définir PermissionLevel = External sur les propriétés de votre projet avant de déployer et modifier la base de données pour approuver le code externe (assurez-vous de lire ailleurs sur les risques de sécurité et les alternatives [comme les certificats]) en exécutant "ALTER DATABASE database_name SET TRUSTWORTHY ON ".
J'ai testé cela en utilisant une requête qui ressemble à:
Et donne: A, B, C, D
la source
J'ai essayé cela, mais pour mes besoins dans MS SQL Server 2005, ce qui suit était le plus utile, que j'ai trouvé sur xaprb
@Mark comme vous l'avez mentionné, c'est le caractère spatial qui m'a causé des problèmes.
la source
À propos de la réponse de J Hardiman, que diriez-vous:
Soit dit en passant, l'utilisation de "Nom de famille" est-elle une faute de frappe ou est-ce que je ne comprends pas un concept ici?
Quoi qu'il en soit, merci beaucoup les gars car cela m'a fait gagner du temps :)
la source
Pour mes collègues Googlers, voici une solution plug-and-play très simple qui a fonctionné pour moi après avoir lutté avec les solutions les plus complexes pendant un certain temps:
Notez que j'ai dû convertir l'ID en VARCHAR afin de le concaténer sous forme de chaîne. Si vous n'avez pas à le faire, voici une version encore plus simple:
Tout le mérite revient à ici: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/9508abc2-46e7-4186-b57f-7f368374e084/replicating-groupconcat-function-of-mysql-in- sql-server? forum = transactsql
la source