Heim >Datenbank >MySQL-Tutorial >Wie eliminiere ich redundante Namespace-Deklarationen in verschachtelten FOR XML PATH-Abfragen?
Eliminieren redundanter Namespace-Deklarationen in verschachtelten FOR XML PATH-Abfragen
Bei FOR XML PATH-Abfragen mit Standard-Namespaces, die mit WITH XMLNAMESPACES deklariert werden, kommt es häufig vor In verschachtelten Abfragen stoßen wir auf doppelte Namespace-Deklarationen. Dieser Artikel befasst sich mit diesem Problem und bietet eine optimale Lösung.
Das Problem tritt auf, wenn Unterabfragen FOR XML verwenden und den Standard-Namespace von der äußeren Abfrage erben. Dies führt zu mehreren Namespace-Deklarationen für die Knoten der Unterabfrage. Zwar gibt es verschiedene Online-Lösungen, aber keine löst dieses Problem vollständig.
Die optimale Lösung
Nach umfangreichen Experimenten wurde die folgende Lösung als die effektivste erachtet:
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
Diese Lösung verwendet eine FOR XML EXPLICIT-Abfrage, um das FOR XML PATH-Abfrageergebnis zu umschließen und so den unerwünschten Namespace effektiv zu entfernen Deklarationen.
Ergebnis
Die Ausgabe dieser Abfrage lautet:
<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>
Die Namespace-Deklaration ist jetzt nur auf der vorhanden Wurzelknoten, wie beabsichtigt.
Das obige ist der detaillierte Inhalt vonWie eliminiere ich redundante Namespace-Deklarationen in verschachtelten FOR XML PATH-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!