É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
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.
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>
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!