消除巢狀FOR XML PATH 查詢中的冗餘命名空間宣告
在使用WITH XMLNAMESPACES 宣告預設命名空間的FOR XML PATH在查詢中,常見的是在嵌套查詢中遇到重複的命名空間聲明。本文解決了這個問題並提供了最佳解決方案。
當子查詢使用 FOR XML 並從外部查詢繼承預設命名空間時,就會出現此問題。這會導致子查詢的節點有多個命名空間聲明。雖然網路上有各種解決方案,但都沒有完全解決這個問題。
最佳解決方案
經過大量實驗,以下解決方案被認為是最有效的:
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
此解決方案利用FOR XML EXPLICIT 查詢來包裝FOR XML PATH 查詢結果,有效刪除不需要的命名空間聲明。
結果
此查詢的輸出將是:
<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>
命名空間聲明現在僅存在於根節點,正如預期的那樣。
以上是如何消除嵌套 FOR XML PATH 查詢中的冗餘命名空間聲明?的詳細內容。更多資訊請關注PHP中文網其他相關文章!