Setelah berjam-jam putus asa dan ratusan cobaan &kesalahan, saya menemukan solusi di bawah ini.
Saya memiliki masalah yang sama, ketika saya ingin hanya satu xmlns
atribut, di root simpul hanya . Tetapi saya juga memiliki kueri yang sangat sulit dengan banyak subkueri dan FOR XML EXPLICIT
metode saja terlalu rumit. Jadi ya, saya menginginkan kenyamanan FOR XML PATH
di subkueri dan juga untuk mengatur xmlns
saya sendiri .
Saya dengan hormat meminjam kode 8kb jawab, karena itu sangat bagus. Saya mengubahnya sedikit untuk pemahaman yang lebih baik. Ini kodenya:
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)
-- Your ordinary 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
Hasil:
<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>
Jika Anda memilih @xml
saja, Anda akan melihat bahwa itu berisi simpul akar dummyTag
. Kami tidak membutuhkannya, jadi kami menghapusnya dengan menggunakan direktif xmltext
di FOR XML EXPLICIT
permintaan:
,@xml AS [xml!1!!xmltext]
Meskipun penjelasan di MSDN terdengar lebih canggih, tetapi secara praktis ia memberitahu parser untuk memilih isi dari XML
simpul akar.
Tidak yakin seberapa cepat kuerinya, namun saat ini saya sedang bersantai dan minum Scotch seperti seorang pria sambil melihat kode dengan tenang...