Génération de listes séparées par des virgules dans SQL Server
Ce guide explique comment créer des listes délimitées par des virgules à partir de tables SQL Server. Les méthodes exploitent FOR XML PATH
et STUFF
pour une génération de liste efficace.
Comprendre l'approche
La technique de base combine FOR XML PATH('')
pour extraire les données sous forme de chaîne (sans balises XML) et STUFF
pour remplacer les espaces par des virgules. Cependant, cette approche a des limites.
Répartition originale des requêtes :
La méthode originale utilise FOR XML PATH('')
pour obtenir des données sous forme de chaîne. L'alias data()
, bien qu'apparemment un élément XML, est une solution de contournement qui produit une erreur lors de la génération XML, gérée ensuite par la requête externe. Cette gestion des erreurs est loin d’être idéale.
Requête améliorée :
Une solution plus robuste est présentée ci-dessous :
<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 améliorée concatène directement les valeurs avec des virgules, éliminant ainsi la solution de contournement XML sujette aux erreurs.
Gestion XML avancée :
Pour éviter des problèmes potentiels avec les caractères XML spéciaux, utilisez .value
pour une gestion XML plus sûre :
<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>
Cette dernière requête offre la méthode la plus fiable pour générer des listes séparées par des virgules dans SQL Server, atténuant ainsi les erreurs potentielles liées au XML. Le .value('.', 'NVARCHAR(MAX)')
convertit explicitement la sortie XML en chaîne, garantissant la compatibilité et empêchant tout comportement inattendu.
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!