2012-12-16 20 views
6

में उप-तत्वों के बिना तत्व पुनर्प्राप्त करें मैं SQL Server 2008 का उपयोग कर रहा हूं और मैं XML तत्वों को पुनर्प्राप्त करना चाहता हूं और तत्व को स्वयं और उसके गुणों को बिना किसी उप तत्वों और पाठ() के बिना वापस कराना चाहता हूं।SQL सर्वर

<doc> 
<apple type="bramley"> tasty <b>yum!</b> </apple> 
<banana color="yellow" shape="bendy"> nice in smoothies </banana> 
</doc> 

मैं चाहूँगा वापस जाने के लिए:

<doc/> 
<apple type="bramley"/> 
<b/> 
<banana color="yellow" shape="bendy"/> 

जैसे डॉक कोई भी उप-नोड्स और बिना किया जाना चाहिये जैसे निम्न XML 4 नोड्स (doc, सेब, ख, केला) है सेबबी उप-नोड के बिना वापस किया जाना चाहिए। लेकिन समस्या यह है कि, यदि मैं SQL सर्वर नोड्स और क्वेरी विधि का उपयोग करता हूं तो मैं उप-नोड्स को हटा नहीं सकता। एसक्यूएल सर्वर का उपयोग करते हुए 2008 करीबी मेरे पास है:

declare @x xml = '<doc> 
    <apple type="bramley"> tasty <b>yum!</b> </apple> 
    <banana color="yellow" shape="bendy"> nice in smoothies </banana> 
</doc>'; 

select 
    c.query('local-name(.)') as Node, 
    c.query('for $e in . return <xx> {$e/@*} </xx>') as Attr 
from @x.nodes('//*') as T(c); 

यह (स्थानीय नाम का प्रयोग करके) प्रत्येक नोड के नाम हो जाता है और नोड के गुण और रिटर्न:

Node Attr 
---- ---- 
doc  <xx /> 
apple <xx type="bramley" /> 
b  <xx /> 
banana <xx color="yellow" shape="bendy" /> 

मुझे लगता है मैं कर सकते हैं इस परिणाम को संसाधित करें, अटार से वर्चर में कनवर्ट करें, एक्सएक्स को नोड कॉलम से बदलें और एक्सएमएल में वापस कनवर्ट करें। लेकिन क्या स्ट्रिंग मैनिप्ल्यूशन के बिना कोई आसान तरीका है?

पुनश्च: यदि यह मदद करता है, मुझे आपत्ति नहीं है समाधान एसक्यूएल सर्वर 2008 या SQL सर्वर का उपयोग करता है, तो 2012

उत्तर

1
आमतौर पर आप गतिशील टैग नाम के साथ तत्व निर्माण का प्रयोग करेंगे, लेकिन एसक्यूएल सर्वर इसका समर्थन नहीं करता

:

declare @x xml = '<doc> 
    <apple type="bramley"> tasty <b>yum!</b> </apple> 
    <banana color="yellow" shape="bendy"> nice in smoothies </banana> 
</doc>'; 

select 
    c.query('local-name(.)') as Node, 
    c.query('for $e in . return element { local-name($e) } { $e/@* } </xx>') as Attr 
from @x.nodes('//*') as T(c); 

एक रूप XQuery अद्यतन विकल्प (SQL Server 2012 के साथ परीक्षण), हम (सभी सामग्री के साथ) सभी नोड्स लाने और नष्ट कर सकते हैं उनके subnotes।

DECLARE @x xml = '<doc>test 
    <apple type="bramley"> tasty <b>yum!</b> </apple> 
    <banana color="yellow" shape="bendy"> nice in smoothies </banana> 
</doc>'; 

-- Fetch all nodes 
SET @x = @x.query('//*') 
-- Delete all subnodes 
SET @x.modify('delete /*/node()') 

select 
    c.query('.') as NewNode 
from @x.nodes('/*') as T(c); 
+0

धन्यवाद! मैं इसे बाद में आजमाऊंगा – Ubercoder

+0

ठीक है मैंने इसे SQL सर्वर में आज़माया लेकिन इसे पसंद नहीं है - त्रुटि है _ केवल निरंतर अभिव्यक्ति गणना की गई तत्व की अभिव्यक्ति और विशेषता creators_ के लिए समर्थित हैं। तो मुझे लगता है कि SQL सर्वर में एक तत्व कन्स्ट्रक्टर के रूप में ** स्थानीय-नाम ($ ई) ** की अनुमति नहीं है (यह तत्व निर्माता को SQL सर्वर में बहुत उपयोगी नहीं बनाता है लेकिन यह एक और कहानी है)। क्या XQuery का कोई अन्य रूप परीक्षण कर सकता हूं? – Ubercoder

+0

एक असली समस्या होने लगता है। [एक अन्य प्रश्न का उत्तर है] (http://stackoverflow.com/a/4418821/695343) जो एक्सएमएल बनाने के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग कर रहा है - वास्तव में, वास्तव में बदसूरत लगता है। "यदि यह दृष्टिकोण आक्रामक है, तो आप अब पढ़ना बंद कर सकते हैं :)" ... उच्च स्तर के दृश्य से अपनी समस्या पर बेहतर नजर डालें; आप अपनी वास्तविक समस्या को हल करने की कोशिश कर रहे हैं? –