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

如何消除嵌套 FOR XML PATH 查詢中的冗餘命名空間聲明?

Mary-Kate Olsen
發布: 2024-12-31 02:44:09
原創
159 人瀏覽過

How to Eliminate Redundant Namespace Declarations in Nested FOR XML PATH Queries?

消除巢狀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 查詢結果,有效刪除不需要的命名空間聲明。

  1. @xml AS [xml!1!!xmltext]:此指令指定從 FOR XML PATH 結果中提取的 XML 內容,不包括虛擬根節點。
  2. 'http://test.com/order' AS [xml!1!xmlns]:此指令明確設定最外層節點所需的命名空間,消除嵌套中的重複宣告

結果

此查詢的輸出將是:

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板