Voici comment cela fonctionne :
L'ajout de FOR XML PATH à la fin d'une requête vous permet d'afficher les résultats de la requête sous forme d'éléments XML, avec le nom de l'élément contenu dans l'argument PATH. Par exemple, si nous devions exécuter l'instruction suivante :
SELECT ',' + name
FROM temp1
FOR XML PATH ('')
En passant une chaîne vide (FOR XML PATH('')), nous obtenons à la place :
,aaa,bbb,ccc,ddd,eee
L'instruction STUFF "remplit" littéralement une chaîne dans une autre, en remplaçant les caractères de la première chaîne. Cependant, nous l'utilisons simplement pour supprimer le premier caractère de la liste de valeurs résultante.
SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
Les paramètres de STUFF
sont :
- La chaîne à « bourrer » (dans notre cas, la liste complète des noms précédée d'une virgule)
- L'emplacement pour commencer à supprimer et à insérer des caractères (1, nous remplissons une chaîne vide)
- Le nombre de caractères à supprimer (1, étant la virgule de tête)
Nous nous retrouvons donc avec :
aaa,bbb,ccc,ddd,eee
Ensuite, nous rejoignons simplement ceci sur la liste des identifiants dans la table temporaire, pour obtenir une liste d'identifiants avec le nom :
SELECT ID, abc = STUFF(
(SELECT ',' + name
FROM temp1 t1
WHERE t1.id = t2.id
FOR XML PATH (''))
, 1, 1, '') from temp1 t2
group by id;
Et nous avons notre résultat :
J'espère que cela vous aidera !