Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menghapuskan Pengisytiharan Ruang Nama Berlebihan dalam Pertanyaan Nested FOR XML PATH?

Bagaimana untuk Menghapuskan Pengisytiharan Ruang Nama Berlebihan dalam Pertanyaan Nested FOR XML PATH?

Mary-Kate Olsen
Lepaskan: 2024-12-31 02:44:09
asal
160 orang telah melayarinya

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

Menghapuskan Pengisytiharan Ruang Nama Terlebih dalam Nested FOR XML PATH Queries

Dalam pertanyaan FOR XML PATH dengan ruang nama lalai diisytiharkan menggunakan WITH XMLNAMESPACES, adalah perkara biasa untuk menemui pengisytiharan ruang nama pendua dalam pertanyaan bersarang. Artikel ini menangani isu ini dan menyediakan penyelesaian yang optimum.

Masalah timbul apabila subkueri menggunakan FOR XML dan mewarisi ruang nama lalai daripada pertanyaan luar. Ini menghasilkan pengisytiharan ruang nama berbilang untuk nod subkueri. Walaupun terdapat pelbagai penyelesaian dalam talian, tiada satu pun menyelesaikan masalah ini sepenuhnya.

Penyelesaian Optimum

Selepas percubaan yang meluas, penyelesaian berikut telah dianggap paling berkesan:

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
Salin selepas log masuk

Penyelesaian ini menggunakan pertanyaan FOR XML EXPLICIT untuk membalut hasil pertanyaan FOR XML PATH, dengan berkesan mengalih keluar pengisytiharan ruang nama yang tidak diingini.

  1. @xml AS [xml!1!!xmltext]: Arahan ini menentukan kandungan XML untuk diekstrak daripada hasil FOR XML PATH, tidak termasuk nod punca dummy.
  2. 'http://test.com/order' AS [xml!1!xmlns]: Arahan ini secara eksplisit menetapkan yang diingini ruang nama untuk nod paling luar, menghapuskan pengisytiharan pendua dalam pertanyaan bersarang.

Hasil

Output daripada pertanyaan ini ialah:

<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>
Salin selepas log masuk

Pengisytiharan ruang nama kini hanya terdapat pada nod akar, seperti yang dimaksudkan.

Atas ialah kandungan terperinci Bagaimana untuk Menghapuskan Pengisytiharan Ruang Nama Berlebihan dalam Pertanyaan Nested FOR XML PATH?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan