Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment Stuff et 'For Xml Path' fonctionnent-ils dans SQL Server ?

Voici comment cela fonctionne :

1. Obtenir la chaîne d'élément XML avec FOR XML

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

2. Supprimer la virgule de début avec STUFF

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

3. Inscrivez-vous sur l'identifiant pour obtenir la liste complète

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 :

Identifiant Nom 1aaa, bbb, ccc, ddd, eee

J'espère que cela vous aidera !