2009-12-11 10 views
20

लाने के लिए यहां मेरी समस्या है: कॉलम के भीतर निम्न XML से, मैं जानना चाहता हूं कि 'सक्षम' नाम वाले चर के मूल्य को एक चरण आईडी दिए गए 'हां' के बराबर है या नहीं और एक घटक आईडी।एक्सपीएथ एसक्यूएल एक्सएमएल वैल्यू

'<xml> 
    <box stepId="1"> 
    <components> 
     <component id="2"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV1" /> 
      <variable id="4" nom="Enabled" valeur="Yes" /> 
     </variables> 
     </component> 
     <component id="3"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV1" /> 
      <variable id="4" nom="Enabled" valeur="No" /> 
     </variables> 
     </component> 
    </components> 
    </box> 
    <box stepId="2"> 
    <components> 
     <component id="2"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV2" /> 
      <variable id="4" nom="Enabled" valeur="Yes" /> 
     </variables> 
     </component> 
     <component id="3"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV2" /> 
      <variable id="4" nom="Enabled" valeur="No" /> 
     </variables> 
     </component> 
    </components> 
    </box> 
</xml>' 

उत्तर

31
में कुछ भी

अद्यतन

मेरे खुलने और संबंधों में एक्सएमएल चूरे और खोज करने के लिए हो सकता है और परिणामस्वरूप संबंध पर मिलती है, एक सेट उन्मुख फैशन में है, न कि XML में विशिष्ट नोड्स खोज की प्रक्रियात्मक फैशन से होगा।

select x.value(N'../../../../@stepId', N'int') as StepID 
    , x.value(N'../../@id', N'int') as ComponentID 
    , x.value(N'@nom',N'nvarchar(100)') as Nom 
    , x.value(N'@valeur', N'nvarchar(100)') as Valeur 
from @x.nodes(N'/xml/box/components/component/variables/variable') t(x) 

हालांकि, अगर आप एक XPath कि ब्याज की बिल्कुल मान प्राप्त करता है का उपयोग करना चाहिए: और

select x.value(N'@valeur', N'nvarchar(100)') as Valeur 
from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/ 
    components/component[@id = sql:variable("@componentID")]/ 
     variables/variable[@nom="Enabled"]') t(x) 

stepID तो यहाँ एक सरल XML क्वेरी कि नोड्स और ब्याज की विशेषताओं बाहर shreds है घटक आईडी स्तंभ हैं, चर नहीं, आपको एसक्यूएल के बजाय एसक्यूएल: कॉलम() का उपयोग करना चाहिए: XPath फ़िल्टर में चर। Binding Relational Data Inside XML Data देखें।

और अंत में आप सभी की जरूरत है अस्तित्व के लिए जाँच करने के लिए आप exist() एक्सएमएल विधि का उपयोग कर सकते है अगर:

select @x.exist(
    N'/xml/box[@stepId=sql:variable("@stepID")]/ 
    components/component[@id = sql:variable("@componentID")]/ 
     variables/variable[@nom="Enabled" and @valeur="Yes"]') 
+4

'@ x' क्या है? * (15 वर्णों के लिए पैडिंग टिप्पणी) * –

+3

मुझे संदेह है कि उसके पास 'DECLARE @x XML = (प्रश्न से xml);' उस XML का उपयोग करके परीक्षण करने के लिए SQL सर्वर क्वेरी विंडो में अपने बयानों के ऊपर है लेकिन उसे हटा दिया गया है जवाब क्योंकि यह अनावश्यक होगा। यह सब कहना है कि मुझे संदेह है कि यह एक चर है जिसमें प्रश्न से एक्सएमएल है। – sirdank

2

मैं हमेशा इस लेख SQL Server 2005 XQuery and XML-DML - Part 1 के लिए वापस जाने SQL सर्वर 2005 में XML सुविधाओं का उपयोग करने के लिए कैसे पता करने के लिए

बुनियादी XPath के लिए, मैं W3Schools tutorial की अनुशंसा करता हूं।

2

मुझे लगता है कि xpath क्वेरी आप चाहते हैं कुछ इस तरह चला जाता है:

/xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"] 

यह आपको चर निर्दिष्ट $ stepId और $ ComponentID के लिए नाम हैं की "हाँ" एक मूल्य के साथ "सक्षम" मिलना चाहिए । यह माना जा रहा है कि आपका एक्सएमएल आपके जैसे टैग से शुरू होता है, और

यदि SQL सर्वर 2005 XPath सामान बहुत सरल है (मैंने कभी इसका उपयोग नहीं किया है), तो उपरोक्त क्वेरी को काम करना चाहिए। अन्यथा, किसी और को इसके साथ आपकी मदद करनी पड़ सकती है।

+0

धन्यवाद, इससे मदद मिली। यदि कोई मिलान मिलता है या नहीं तो मैं एक सच्चा या झूठा कैसे लौटा सकता हूं? या 0 या 1. – joerage

+0

वापस आओ मुझे यकीन नहीं है।आप इस तरह कुछ कोशिश कर सकते हैं: आईएफ गिनती (<आपकी xpath क्वेरी>)> = 1 चुनें 1 ईएलएसई चुनें 0 –

+0

आप EXIST विधि का उपयोग कर सकते हैं। Field.EXIST ('xpath') –

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