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

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

Mary-Kate Olsen
Libérer: 2024-12-31 02:44:09
original
161 Les gens l'ont consulté

How to Eliminate Redundant Namespace Declarations in Nested FOR XML PATH Queries?

Élimination des déclarations d'espace de noms redondantes dans les requêtes FOR XML PATH imbriquées

Dans les requêtes FOR XML PATH avec des espaces de noms par défaut déclarés à l'aide de WITH XMLNAMESPACES, il est courant de rencontrer des déclarations d'espace de noms dupliquées dans les requêtes imbriquées. Cet article aborde ce problème et propose une solution optimale.

Le problème survient lorsque les sous-requêtes utilisent FOR XML et héritent de l'espace de noms par défaut de la requête externe. Cela entraîne plusieurs déclarations d'espace de noms pour les nœuds de la sous-requête. Bien qu'il existe diverses solutions en ligne, aucune ne résout complètement ce problème.

La solution optimale

Après des expérimentations approfondies, la solution suivante a été jugée la plus efficace :

DECLARE @Order TABLE (OrderID INT, OrderDate DATETIME)    
DECLARE @OrderDetail TABLE (OrderID INT, ItemID VARCHAR(1), Name VARCHAR(50), Qty INT)    
INSERT @Order VALUES (1, '2010-01-01'), (2, '2010-01-02')    
INSERT @OrderDetail VALUES (1, 'A', 'Drink',  5),
                           (1, 'B', 'Cup',    2),
                           (2, 'A', 'Drink',  2),
                           (2, 'C', 'Straw',  1),
                           (2, 'D', 'Napkin', 1)

-- FOR XML PATH query
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)

-- Magic happens here!
SELECT 1 AS Tag
      ,NULL AS Parent
      ,@xml AS [xml!1!!xmltext]
      ,'http://test.com/order' AS [xml!1!xmlns]
FOR XML EXPLICIT
Copier après la connexion

Cette solution utilise une requête FOR XML EXPLICIT pour envelopper le résultat de la requête FOR XML PATH, supprimant ainsi efficacement l'espace de noms indésirable. déclarations.

  1. @xml AS [xml!1!!xmltext] : Cette directive spécifie le contenu XML à extraire du résultat FOR XML PATH, à l'exclusion du nœud racine factice.
  2. 'http://test.com/order' AS [xml!1!xmlns] : Cette directive définit explicitement l'espace de noms souhaité pour le nœud le plus externe, éliminant les déclarations en double dans les requêtes.

Résultat

Le résultat de cette requête 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>
Copier après la connexion

La déclaration d'espace de noms est désormais présente uniquement sur le nœud racine, comme prévu.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal