Maison >base de données >tutoriel mysql >Comment puis-je éliminer les déclarations d'espace de noms redondantes dans les requêtes imbriquées « FOR XML PATH » ?

Comment puis-je éliminer les déclarations d'espace de noms redondantes dans les requêtes imbriquées « FOR XML PATH » ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-02 16:21:40993parcourir

How Can I Eliminate Redundant Namespace Declarations in Nested

Élimination des espaces de noms imbriqués dans les requêtes "FOR XML PATH"

Dans le contexte des requêtes "FOR XML PATH" utilisant "WITH XMLNAMESPACES" pour définir les espaces de noms par défaut, les requêtes imbriquées peut introduire des déclarations d'espace de noms redondantes au niveau supérieur. Ce problème survient lorsque les sous-requêtes utilisent « FOR XML PATH » dans la requête imbriquée.

Exemple :

Considérez la requête suivante :

...
select 
    a.c2 as "@species"
    , (select l.c3 as "text()" 
       from t2 l where l.c2 = a.c1 
       for xml path('leg'), type) as "legs"
from t1 a
for xml path('animal'), root('zoo')
...

Ici, la requête imbriquée pour "legs" entraînera une déclaration d'espace de noms supplémentaire pour "uri:animal" sur les "legs" élément.

Solution :

Pour éliminer cette redondance, une combinaison de "FOR XML PATH" dans les sous-requêtes et "FOR XML EXPLICIT" dans la requête principale peut être utilisée. Cette approche implique d'utiliser la directive "xmltext" dans la requête "FOR XML EXPLICIT" pour supprimer la déclaration d'espace de noms la plus externe.

DECLARE @xml XML = (SELECT OrderID AS "@OrderID",
                        (SELECT ItemID AS "@ItemID", 
                                Name AS "data()" 
                         FROM @OrderDetail 
                         WHERE OrderID = o.OrderID 
                         FOR XML PATH ('Item'), TYPE)
                    FROM @Order o 
                    FOR XML PATH ('Order'), ROOT('dummyTag'), TYPE)

SELECT 1 AS Tag
      ,NULL AS Parent
      ,@xml AS [xml!1!!xmltext]
      ,'http://test.com/order' AS [xml!1!xmlns]
FOR XML EXPLICIT

Le résultat sera :

<xml xmlns="http://test.com/order">
  <Order OrderID="1">
    <Item ItemID="A">Drink</Item>
    <Item ItemID="B">Cup</Item>
  </Order>
  <Order OrderID="2">
    <Item ItemID="A">Drink</Item>
    <Item ItemID="C">Straw</Item>
    <Item ItemID="D">Napkin</Item>
  </Order>
</xml>

Cette technique fournit la flexibilité de "FOR XML PATH" pour les requêtes imbriquées tout en conservant une seule déclaration d'espace de noms sur le nœud racine.

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