在「FOR XML PATH」查詢的上下文中使用「WITH XMLNAMESPACES」定義預設命名空間、嵌套查詢可以在頂層引入冗餘的命名空間聲明。當子查詢在巢狀查詢中使用「FOR XML PATH」時,就會出現此問題。
考慮以下查詢:
... 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') ...
此處,巢狀查詢為「legs」會導致「legs」上的「u ri:animal」的附加命名空間聲明
要消除這種冗餘,可以在子查詢中結合使用「FOR XML PATH」和主查詢中的「FOR XML EXPLICIT」。此方法涉及在「FOR XML EXPLICIT」查詢中使用「xmltext」指令來抑制最外層的命名空間聲明。
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
結果將是:
<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」對於巢狀查詢的靈活性,同時在根節點上維護單一命名空間聲明。
以上是如何消除巢狀「FOR XML PATH」查詢中的冗餘命名空間聲明?的詳細內容。更多資訊請關注PHP中文網其他相關文章!