2011-02-15 13 views
8

मेरे पास एक एक्सएमएल फ़ील्ड है जो मुझे पता है कि इसमें कम से कम एक "चाइल्ड नोड" होगा, लेकिन संभवतः अधिक। मैं टी-एसक्यूएल में एक लूप बनाने की कोशिश कर रहा हूं जो प्रत्येक चाइल्ड नोड का एक्सएमएल वर्कर (1000) के रूप में प्राप्त करेगा और इसके साथ कुछ तर्क करेगा। जब मैं निम्नलिखित ...मैं टी-एसक्यूएल में एक्सएमएल फ़ील्ड के नोड्स के माध्यम से कैसे पुन: प्रयास करूं?

... 
SET @intIterator=1 

SET @strValue = (SELECT XMLField.value('(/RootNode/ParentNode/ChildNode)[' + CAST(@intIterator AS VARCHAR(2)) + ']', VARCHAR(1000)) WHERE [email protected]) 

WHILE LEN(@strValue) > 0 
    BEGIN 

     --LOGIC with @strValue not shown. 
     @intIterator = @intIterator + 1 
     @strValue = (SELECT XMLField.value('(/RootNode/ParentNode/ChildNode)[' + CAST(@intIterator AS VARCHAR(2)) + ']', VARCHAR(1000)) WHERE [email protected]) 

    END 

कोशिश मैं निम्नलिखित त्रुटि मिलती है: XML डेटा प्रकार विधि "मूल्य" का तर्क 1 एक स्ट्रिंग शाब्दिक होना आवश्यक है।

मुझे पता है कि जब मैं @intIterator को वैल्यू विधि में उपयोग करने का प्रयास करता हूं तो यह उड़ा रहा है क्योंकि यह एक चर के बजाय स्ट्रिंग अक्षर चाहता है, लेकिन फिर मैं टी-एसक्यूएल में एक-एक करके बच्चे नोड्स के माध्यम से कैसे पुन: प्रयास कर सकता हूं ?

उत्तर

14

मैं किसी भी विचार आपके XML कैसा दिखता नहीं है, लेकिन आप शायद एक अलग दृष्टिकोण का उपयोग करना पड़ - पुनरावृति और पाश और इस तरह सामान की कोशिश न करें - बजाय XQuery में .nodes() समारोह का उपयोग करें:

SELECT 
    Child.value('(SomeElement)[1]', 'int'), 
    Child.value('(SomeOtherElement)[1]', 'Varchar(50)') 
FROM 
    XMLField.nodes("/RootNode/ParentNode/ChildNode") AS N(Child) 

वह मूल रूप से/बार-बार दोहराना छोड़ देता है XQuery के पाशन और आप सूचकांक या कि सब पर ऐसा कुछ के साथ चारों ओर गंदगी की जरूरत नहीं है .....

+2

काफी सही। आप एक रिलेशनल डेटाबेस में हैं। सेट-आधारित तर्क सोचें, लूपिंग और प्रक्रियात्मक तर्क नहीं। –

+0

क्षमा करें @marc_s, क्या आप अपनी पोस्ट संपादित कर सकते हैं। 'वर्चर (50)' में एक अतिरिक्त कॉमा है), '। मैं संपादित नहीं कर सकता क्योंकि यह केवल 1 प्रतीक है। – new2ios

+0

@ new2ios: किया - इसे इंगित करने के लिए धन्यवाद –

5

अभी भी उप तत्वों क्वेरी करने के लिए एक की जरूरत हो सकता है जो इस सवाल का जवाब हल नहीं करेगा। आप केवल एक विशिष्ट नोड के उप तत्वों को क्वेरी करने के लिए एक स्ट्रिंग शाब्दिक तर्क की नोड्स() आवश्यकता को पूरा करने के लिए एसक्यूएल: वैरिएबल का उपयोग कर सकते हैं।

DECLARE @iterator = 1 

SELECT 
    Child.value('(SomeElement)[1]', 'int'), 
    Child.value('(SomeOtherElement)[1]', 'Varchar(50)'), 
FROM 
    XMLField.nodes("/RootNode/ParentNode[sql:variable("@iterator")]/ChildNode") AS N(Child) 
संबंधित मुद्दे

 संबंधित मुद्दे