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 ?
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!