मुझे नीचे दिए गए एक्सएमएल को पार्स करने और प्रत्येक उदाहरण_कोड या बॉडी_टेक्स्ट के लिए परिणाम में एक नई पंक्ति बनाने की आवश्यकता है - ये तत्व किसी भी क्रम में मौजूद हो सकते हैं और मैं नीचे दी गई तालिका में दिखाए गए परिणामसेट बनाने की कोशिश कर रहा हूं।

  declare @Xml xml = '
<Demonstrative_Examples>    
                             <Demonstrative_Example>
                                    <Intro_Text>
                                           This is the intro
                                    </Intro_Text>
                                    <Example_Code Nature="bad" >                                           
                                                  Example 1.1                                
                                    </Example_Code>
                                    <Body_Text>Body 1.1</Body_Text>
                                    <Example_Code>                            
                                                  Example 1.2          
                                    </Example_Code>
                             </Demonstrative_Example>
                             <Demonstrative_Example>
                                    <Intro_Text>
                                           This is the 2nd intro
                                    </Intro_Text>
                                    <Body_Text>Body 2.1</Body_Text>
                                    <Example_Code Nature="Good">                                           
                                                  Example 2.1                                
                                    </Example_Code>                           
                             </Demonstrative_Example>
       </Demonstrative_Examples>'


SELECT        1 as 'Demonstrative_Example_ID',
                                    1 as 'OrderID',                                                 
                                 DemonstrativeExample.x.value('(Intro_Text)[1]','nvarchar(4000)')  AS 'Intro_Text',     
                                    Body.x.value('.','nvarchar(4000)') AS 'Body_Text',                                                                             
                                    ExampleCode.x.value('.','varchar(200)') AS 'Example_Code',
                                    ExampleCode.x.value('(@Nature)[1]','nvarchar(100)') AS 'Example_CodeNature'                             
FROM   @Xml.nodes('//Demonstrative_Examples/Demonstrative_Example') AS DemonstrativeExample(x) 
                      OUTER APPLY DemonstrativeExample.x.nodes('./Body_Text') AS Body(x)
                      OUTER APPLY DemonstrativeExample.x.nodes('./Example_Code') AS ExampleCode(x)

उपरोक्त टी-एसक्यूएल का उपयोग करके मैं निम्नानुसार एक परिणाम वापस करना चाहता हूं:

enter image description here

क्या कोई सुझाव दे सकता है कि इच्छित परिणाम प्राप्त करने के लिए टी-एसक्यूएल को कैसे संशोधित किया जाए?

0
DeadlyDan 10 नवम्बर 2020, 18:14

1 उत्तर

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

यहाँ XQuery और FLWOR व्यंजक पर आधारित एक समाधान दिया गया है।

यह दो चरणों वाली प्रक्रिया है:

  1. मूल XML से उचित XML की रचना करना।
  2. चरण #1 से XML को एक आयताकार/संबंधपरक प्रारूप में परिवर्तित करना।

सीटीई निम्नलिखित एक्सएमएल का उत्सर्जन करता है (चरण # 1):

<root>
  <r id="1" pos="1" Intro_Text="This is the intro" Body_Text="" Example_Code="Example 1.1" Nature="bad" />
  <r id="1" pos="2" Intro_Text="This is the intro" Body_Text="Body 1.1" Example_Code="" Nature="" />
  <r id="1" pos="3" Intro_Text="This is the intro" Body_Text="" Example_Code="Example 1.2" Nature="" />
  <r id="2" pos="1" Intro_Text="This is the 2nd intro" Body_Text="Body 2.1" Example_Code="" Nature="" />
  <r id="2" pos="2" Intro_Text="This is the 2nd intro" Body_Text="" Example_Code="Example 2.1" Nature="Good" />
</root>

एसक्यूएल

DECLARE @Xml XML = 
N'<Demonstrative_Examples>
    <Demonstrative_Example>
        <Intro_Text>This is the intro</Intro_Text>
        <Example_Code Nature="bad">Example 1.1</Example_Code>
        <Body_Text>Body 1.1</Body_Text>
        <Example_Code>Example 1.2</Example_Code>
    </Demonstrative_Example>
    <Demonstrative_Example>
        <Intro_Text>This is the 2nd intro</Intro_Text>
        <Body_Text>Body 2.1</Body_Text>
        <Example_Code Nature="Good">Example 2.1</Example_Code>
    </Demonstrative_Example>
</Demonstrative_Examples>';

-- just to see
SELECT @xml.query('<root>
{
    for $x in /Demonstrative_Examples/Demonstrative_Example
    let $id := count(/Demonstrative_Examples/Demonstrative_Example[. << $x[1]]) + 1
        for $y in $x/*[position() gt 1]
        let $pos := count($x/*[. << $y[1]]) + 1
        let $it := $x/*[local-name()="Intro_Text"]
        return <r id="{$id}" pos="{$pos - 1}" 
            Intro_Text="{$it}" 
            Body_Text="{$y[local-name()="Body_Text"]/text()}" 
            Example_Code="{$y[local-name()="Example_Code"]/text()}"
            Nature="{$y[local-name()="Example_Code"]/@Nature}"></r>
}
</root>') AS xmldata;

-- real deal
;WITH rs AS
(
    SELECT @xml.query('<root>
    {
        for $x in /Demonstrative_Examples/Demonstrative_Example
        let $id := count(/Demonstrative_Examples/Demonstrative_Example[. << $x[1]]) + 1
            for $y in $x/*[position() gt 1]
            let $pos := count($x/*[. << $y[1]]) + 1
            let $it := $x/*[local-name()="Intro_Text"]
            return <r id="{$id}" pos="{$pos - 1}" 
                Intro_Text="{$it}" 
                Body_Text="{$y[local-name()="Body_Text"]/text()}" 
                Example_Code="{$y[local-name()="Example_Code"]/text()}"
                Nature="{$y[local-name()="Example_Code"]/@Nature}"></r>
    }
    </root>') AS xmldata
)
SELECT c.value('@id', 'INT') AS [ID] 
    , c.value('@pos', 'INT') AS [Order]
    , c.value('@Intro_Text', 'VARCHAR(30)') AS [Intro_Text]
    , c.value('@Body_Text', 'VARCHAR(30)') AS [Body_Text]
    , c.value('@Example_Code', 'VARCHAR(30)') AS [Example_Code]
    , c.value('@Nature', 'VARCHAR(30)') AS [Nature]
FROM rs CROSS APPLY xmldata.nodes('/root/r') AS t(c);

आउटपुट

+----+-------+-----------------------+-----------+--------------+--------+
| ID | Order |      Intro_Text       | Body_Text | Example_Code | Nature |
+----+-------+-----------------------+-----------+--------------+--------+
|  1 |     1 | This is the intro     |           | Example 1.1  | bad    |
|  1 |     2 | This is the intro     | Body 1.1  |              |        |
|  1 |     3 | This is the intro     |           | Example 1.2  |        |
|  2 |     1 | This is the 2nd intro | Body 2.1  |              |        |
|  2 |     2 | This is the 2nd intro |           | Example 2.1  | Good   |
+----+-------+-----------------------+-----------+--------------+--------+
1
Yitzhak Khabinsky 10 नवम्बर 2020, 20:58