Maison >base de données >tutoriel mysql >Comment générer des listes séparées par des virgules à partir de tables SQL Server à l'aide de requêtes ?

Comment générer des listes séparées par des virgules à partir de tables SQL Server à l'aide de requêtes ?

DDD
DDDoriginal
2025-01-18 10:07:41592parcourir

How to Generate Comma-Separated Lists from SQL Server Tables Using Queries?

SQL Server : utiliser une requête pour générer une liste séparée par des virgules

Explication de la requête

Cette requête est conçue pour créer une liste séparée par des virgules à partir d'une table, elle utilise la fonction FOR XML PATH pour construire un fragment XML contenant les valeurs requises. Il utilise une sous-requête pour obtenir le nom de l'employé (ename) pour un service spécifié, puis remplace les espaces du fragment XML par des virgules.

<code class="language-sql">SELECT 
    E1.deptno, 
    allemp = Replace ((SELECT E2.ename AS 'data()' 
                       FROM emp AS e2 
                       WHERE e1.deptno = e2.DEPTNO 
                       FOR xml PATH('')), ' ', ', ') 
 FROM EMP AS e1 
 GROUP BY DEPTNO; </code>

Comment fonctionne FOR XML PATH

FOR XML PATH('') génère un fragment XML pour chaque ligne de la table emp en fonction de la colonne spécifiée (dans ce cas, ename). Supposons qu'il existe une simple table d'employés :

<code>EmployeeID      Name
1               John Smith
2               Jane Doe</code>

La requête suivante créera du XML :

<code class="language-sql">SELECT  EmployeeID, Name
FROM    emp.Employee
FOR XML PATH ('Employee');</code>

Sortie :

<code class="language-xml"><employee><employeeid>1</employeeid><name>John Smith</name></employee><employee><employeeid>2</employeeid><name>Jane Doe</name></employee></code>

Gestion des erreurs et alternatives

La requête fournie tente d'utiliser data() comme balise XML, ce qui n'est pas valide et entraînera une erreur. Pour éviter cela, vous pouvez utiliser la requête modifiée suivante :

<code class="language-sql">SELECT  E1.deptno, 
        STUFF(( SELECT  ', ' + E2.ename 
                FROM    emp AS e2 
                WHERE   e1.deptno = e2.DEPTNO 
                FOR XML PATH('')
            ), 1, 2, '') 
FROM    EMP AS e1 
GROUP BY DEPTNO; </code>

Cette requête garantit qu'aucune balise XML n'est créée dans la sous-requête et gère également les noms contenant des espaces en ajoutant des virgules dans la sous-requête.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn