首頁 >資料庫 >mysql教程 >如何消除巢狀「FOR XML PATH」查詢中的冗餘命名空間聲明?

如何消除巢狀「FOR XML PATH」查詢中的冗餘命名空間聲明?

Linda Hamilton
Linda Hamilton原創
2025-01-02 16:21:40992瀏覽

How Can I Eliminate Redundant Namespace Declarations in Nested

「FOR XML PATH」查詢中的巢狀命名空間消除

在「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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn