घंटों की हताशा और सैकड़ों परीक्षणों और त्रुटियों के बाद, मैं नीचे समाधान लेकर आया हूं।
मेरी भी यही समस्या थी, जब मैं सिर्फ एक चाहता था xmlns
विशेषता, रूट . पर नोड केवल . लेकिन मेरे पास बहुत सारी सबक्वायरी और FOR XML EXPLICIT
के साथ एक बहुत ही कठिन प्रश्न था। अकेले तरीका बहुत बोझिल था। तो हाँ, मुझे FOR XML PATH
. की सुविधा चाहिए थी उपश्रेणियों में और मेरा अपना xmlns
. भी सेट करने के लिए ।
मैंने कृपया 8kb's . का कोड उधार लिया है उत्तर, क्योंकि यह बहुत अच्छा था। मैंने इसे बेहतर ढंग से समझने के लिए थोड़ा सा ट्वीक किया। यहाँ कोड है:
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
परिणाम:
<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>
अगर आपने @xml
. चुना है अकेले, आप देखेंगे कि इसमें रूट नोड है dummyTag
. हमें इसकी आवश्यकता नहीं है, इसलिए हम इसे directive<का उपयोग करके हटा देते हैं /ए> xmltext
में FOR XML EXPLICIT
क्वेरी:
,@xml AS [xml!1!!xmltext]
हालांकि एमएसडीएन में स्पष्टीकरण अधिक परिष्कृत लगता है, लेकिन व्यावहारिक रूप से यह पार्सर को सामग्री चुनने के लिए कहता है XML
. का रूट नोड।
सुनिश्चित नहीं है कि क्वेरी कितनी तेज़ है, फिर भी वर्तमान में मैं शांति से कोड को देखते हुए एक सज्जन की तरह स्कॉच को आराम और पी रहा हूं...