Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Menghapuskan Pengisytiharan Ruang Nama Berlebihan dalam Pertanyaan 'FOR XML PATH' Bersarang?

Bagaimanakah Saya Boleh Menghapuskan Pengisytiharan Ruang Nama Berlebihan dalam Pertanyaan 'FOR XML PATH' Bersarang?

Linda Hamilton
Lepaskan: 2025-01-02 16:21:40
asal
1012 orang telah melayarinya

How Can I Eliminate Redundant Namespace Declarations in Nested

Penghapusan Ruang Nama Bersarang dalam Pertanyaan "FOR XML PATH"

Dalam konteks pertanyaan "FOR XML PATH" menggunakan "WITH XMLNAMESPACES" untuk menentukan ruang nama lalai, pertanyaan bersarang boleh memperkenalkan pengisytiharan ruang nama yang berlebihan di peringkat atas. Isu ini timbul apabila subkueri menggunakan "FOR XML PATH" dalam pertanyaan bersarang.

Contoh:

Pertimbangkan pertanyaan berikut:

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

Di sini, pertanyaan bersarang untuk "legs" akan menghasilkan pengisytiharan ruang nama tambahan untuk "uri:animal" pada "legs" elemen.

Penyelesaian:

Untuk menghapuskan lebihan ini, gabungan "FOR XML PATH" dalam subkueri dan "FOR XML EXPLICIT" dalam pertanyaan utama boleh digunakan. Pendekatan ini melibatkan penggunaan arahan "xmltext" dalam pertanyaan "FOR XML EXPLICIT" untuk menyekat perisytiharan ruang nama paling luar.

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

Hasilnya 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

Teknik ini menyediakan fleksibiliti "FOR XML PATH" untuk pertanyaan bersarang sambil mengekalkan satu pengisytiharan ruang nama pada akar nod.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghapuskan Pengisytiharan Ruang Nama Berlebihan dalam Pertanyaan 'FOR XML PATH' Bersarang?. 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