Maison >base de données >tutoriel mysql >Comment créer des listes délimitées par des virgules dans SQL Server à l'aide de FOR XML PATH ?

Comment créer des listes délimitées par des virgules dans SQL Server à l'aide de FOR XML PATH ?

DDD
DDDoriginal
2025-01-18 10:27:10612parcourir

How to Create Comma-Delimited Lists in SQL Server Using FOR XML PATH?

Utilisez FOR XML PATH pour créer une liste séparée par des virgules dans SQL Server

Cet exemple montre comment utiliser FOR XML PATH pour créer une liste séparée par des virgules à partir d'un tableau :

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

Explication détaillée :

Le cœur de cette requête est de savoir comment FOR XML PATH gère le XML réel. Considérons un tableau d'employés simplifié :

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

FOR XML PATH Convertissez les données au format XML. Exécutez la requête suivante :

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

générera le XML suivant :

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

L'omission de l'élément 'Employee' de la clause PATH supprime la balise XML externe. Requête modifiée :

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

générera :

<code class="language-xml"><name>John Smith</name><name>Jane Doe</name></code>

Dans la requête d'origine, l'alias de colonne 'data()' a déclenché une erreur lors de la tentative de création d'une balise XML non valide. Pour résoudre ce problème, les sous-requêtes corrélées masquent les erreurs, suppriment les étiquettes et génèrent du texte brut.

<code class="language-sql">SELECT  Name AS [Data()]
FROM    Employee
FOR XML PATH ('')</code>

Enfin, REPLACE remplace les espaces dans la liste par des virgules.

Requête améliorée :

Cependant, la requête améliorée suivante est préférable :

<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 utilise STUFF pour supprimer la première virgule et l'espace, évitant ainsi les erreurs lorsque le nom contient des espaces. L'omission des alias de colonne empêche la création de balises XML.

Autres notes :

Pour échapper aux caractères XML spéciaux, utilisez .value en combinaison avec FOR XML PATH :

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

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