मेरे पास निम्न SQL स्क्रिप्ट है (और नीचे एक्सएमएल संरचना):

DECLARE @questions XML

SELECT 
    t.Col.value('QuestionId[1]', 'int') AS  QuestionId,
    t.Col.value('Options[1]/string[1]', 'varchar(MAX)') Options 
FROM 
    @questions.nodes ('//Question') t(Col) 
WHERE 
    t.Col.value('QuestionId[1]', 'int') = 5

SELECT क्वेरी Options चाइल्ड स्ट्रिंग (नीला) के लिए केवल पहली पंक्ति लौटा रही है। t.Col.value('Options[1]/string[1]', 'varchar(MAX)') को बदलकर मैं सभी मानों को 4 पंक्तियों (नीला, लाल, सफेद, काला) के रूप में कैसे प्राप्त कर सकता हूं?

SET @questions = '<?xml version="1.0" encoding="UTF-8"?>
    <Questions>
       <Question>
          <RowType>Question</RowType>
          <Required>False</Required>
          <QuestionText>select color</QuestionText>
          <QuestionType>Radio Buttons</QuestionType>
          <QuestionId>5</QuestionId>
          <Options>
             <string>Blue</string>
             <string>Red</string>
             <string>White</string>
             <string>Black</string>
          </Options>
       </Question>
       <Question>
          <RowType>Question</RowType>
          <Required>False</Required>
          <QuestionText>select color</QuestionText>
          <QuestionType>Radio Buttons</QuestionType>
          <QuestionId>6</QuestionId>
          <Options />
       </Question>
    </Questions>'
5
SA. 15 जून 2018, 22:05

2 जवाब

सबसे बढ़िया उत्तर

आपको चाहिए apply :

SELECT t.col.value('(./QuestionId)[1]','int') AS QuestionId,
       t1.Col.value('(text())[1]', 'varchar(max)') AS Options
FROM @questions.nodes ('/Questions/Question') t(Col) OUTER APPLY 
     t.Col.nodes('Options/*') t1(Col);
2
Yogesh Sharma 19 जून 2018, 18:12

आप Questions/Question/Options/string के साथ <string> टैग स्तर तक पहुंचने के लिए नीचे जा सकते हैं और फिर QuestionId प्राप्त करने के लिए एक स्तर पीछे जा सकते हैं:

SELECT 
    t.col.value('(//QuestionId)[1]','int') AS QuestionId,
    t.Col.value('(.)[1]' ,'varchar(50)')   AS Options 
FROM @questions.nodes ('Questions/Question/Options/string') t(Col) 
WHERE t.Col.value('(//QuestionId)[1]', 'int') = 5

परिणाम:

enter image description here

जैसा कि टिप्पणियों में बताया गया है, उपरोक्त समाधान तब काम नहीं करेगा जब एक और <question> टैग का चयन किया जाना चाहिए।

यह 4 <question> टैग के साथ नया इनपुट परिदृश्य है:

<?xml version="1.0" encoding="UTF-8"?>
<Questions>
    <Question>
        <RowType>Question</RowType>
        <Required>False</Required>
        <QuestionText>select color</QuestionText>
        <QuestionType>Radio Buttons</QuestionType>
        <QuestionId>6</QuestionId>
        <Options />
    </Question>
    <Question>
        <RowType>Question</RowType>
        <Required>False</Required>
        <QuestionText>select color</QuestionText>
        <QuestionType>Radio Buttons</QuestionType>
        <QuestionId>5</QuestionId>
        <Options>
            <string>Blue</string>
            <string>Red</string>
            <string>White</string>
            <string>Black</string>
        </Options>
    </Question>
    <Question>
        <RowType>Question</RowType>
        <Required>False</Required>
        <QuestionText>select color</QuestionText>
        <QuestionType>Radio Buttons</QuestionType>
        <QuestionId>7</QuestionId>
        <Options />
    </Question>
    <Question>
        <RowType>Question</RowType>
        <Required>False</Required>
        <QuestionText>select color</QuestionText>
        <QuestionType>Radio Buttons</QuestionType>
        <QuestionId>8</QuestionId>
        <Options>
            <string>Blue</string>
            <string>Red</string>
            <string>White</string>
            <string>Black</string>
        </Options>
    </Question>
</Questions>

निम्नलिखित क्वेरी का उपयोग करना:

SELECT 
    t.col.value('((.)/QuestionId)[1]','int') AS QuestionId,
    u.Col.value('(.)[1]' ,'varchar(50)')     AS Options 
FROM @questions.nodes ('Questions/*')    t(Col) 
    OUTER APPLY t.Col.nodes('Options/*') u(Col)

ये परिणाम हैं:

enter image description here

जहां क्लॉज को लागू करने से वांछित परिणाम प्राप्त होते हैं:

enter image description here

1
Andrea 20 जून 2018, 09:51