Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एक्सएमएल पथ के लिए उपयोग करते समय मैं नेस्टेड क्वेरी में अनावश्यक नामस्थान को कैसे हटा सकता हूं?

घंटों की हताशा और सैकड़ों परीक्षणों और त्रुटियों के बाद, मैं नीचे समाधान लेकर आया हूं।

मेरी भी यही समस्या थी, जब मैं सिर्फ एक चाहता था 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 . का रूट नोड।

सुनिश्चित नहीं है कि क्वेरी कितनी तेज़ है, फिर भी वर्तमान में मैं शांति से कोड को देखते हुए एक सज्जन की तरह स्कॉच को आराम और पी रहा हूं...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पैरामीटर वैरिएबल पर लाइक का उपयोग करना?

  2. SQL सर्वर में ट्रिगर की सूची लौटाएं

  3. SQL सर्वर ब्लॉकिंग के साथ DBA डोर पर ब्लॉक, ब्लॉक, ब्लॉकिंग

  4. चुनिंदा क्वेरी में ऑटो इंक्रीमेंट फ़ील्ड कैसे जनरेट करें?

  5. 7645 अशक्त या खाली पूर्ण-पाठ विधेय