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.
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') ...
Di sini, pertanyaan bersarang untuk "legs" akan menghasilkan pengisytiharan ruang nama tambahan untuk "uri:animal" pada "legs" elemen.
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
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>
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!