<p>Voici comment cela fonctionne :</p>
<p><strong>1. Obtenir une chaîne d’éléments XML avec FOR XML</strong></p>
<p>Ajouter FOR XML PATH à la fin d’une requête vous permet de produire 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 exécutons l’instruction suivante :</p>
<pre><code class="lang-auto">SELECT ',' + name
FROM temp1
FOR XML PATH ('')
</code></pre>
<p>En passant une chaîne vide (FOR XML PATH(‘’)), nous obtenons plutôt ceci :</p>
<pre><code class="lang-auto">,aaa,bbb,ccc,ddd,eee
</code></pre>
<p><strong>2. Supprimer la virgule initiale avec STUFF</strong></p>
<p>L’instruction STUFF “insère” littéralement une chaîne dans une autre, en remplaçant des caractères dans la première chaîne. Cependant, nous l’utilisons ici simplement pour supprimer le premier caractère de la liste de valeurs résultante.</p>
<pre><code class="lang-auto">SELECT abc = STUFF((
SELECT ',' + NAME
FROM temp1
FOR XML PATH('')
), 1, 1, '')
FROM temp1
</code></pre>
<p>Les paramètres de <code>STUFF</code> sont :</p>
<ul>
<li></li>
</ul>
<p>La chaîne dans laquelle “insérer” (dans notre cas, la liste complète des noms avec une virgule initiale)</p>
<ul>
<li></li>
</ul>
<p>La position de début pour la suppression et l’insertion de caractères (<em>1, nous insérons dans une chaîne vide</em>)</p>
<ul>
<li></li>
</ul>
<p>Le nombre de caractères à supprimer (<em>1, soit la virgule initiale</em>)</p>
<ul>
<li></li>
</ul>
<p>Le caractère de remplacement (<em>un caractère vide, ‘’, dans ce cas</em>)</p>
<p>Nous obtenons donc :</p>
<pre><code class="lang-auto">aaa,bbb,ccc,ddd,eee
</code></pre>
<p><strong>3. Joindre sur l’id pour obtenir la liste complète</strong></p>
<p>Ensuite, nous joignons simplement cela sur la liste des id dans la table temporaire, pour obtenir une liste d’IDs avec les noms :</p>
<pre><code class="lang-auto">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;
</code></pre>
<p>Et nous avons notre résultat :</p>
<p>Id<br>
Name</p>
<p>1<br>
aaa,bbb,ccc,ddd,eee</p>