2013-03-28 4 views
19

एक्सएमएल इस तरह दिखता है:एसक्यूएल सर्वर में XML पार्स करें

<GespeicherteDaten> 
    <strategieWuerfelFelder Type="strategieWuerfelFelder"> 
     <Felder X="3" Y="3" Z="3"> 
      <Feld X="1" Y="1" Z="1"> 
       <strategieWuerfelFeld Type="strategieWuerfelFeld"> 
        <Name>Name</Name> 
        <Beschreibung>Test</Beschreibung> 
       </strategieWuerfelFeld> 
      </Feld> 
      <Feld X="1" Y="1" Z="2"> 
       <strategieWuerfelFeld Type="strategieWuerfelFeld"> 
        <Name>Name2</Name> 
        <Beschreibung>Test2</Beschreibung> 
       </strategieWuerfelFeld> 
      </Feld> 
     </Felder> 
    </strategieWuerfelFelder> 
</GespeicherteDaten>' 

मेरे परिणाम तालिका गुण Felder-> पहला, दूसरा, जेड, Feld-> पहला, दूसरा, जेड और नाम शामिल करना चाहिए।

तरह:

Felder_X | Felder_Y | Felder_Z | Feld_X | Feld_Y | Feld_Z | Name 

यह एक प्रश्न या संग्रहीत प्रक्रिया से सीधे इस मूल्यों को प्राप्त करना संभव है?

उत्तर

28
DECLARE @xml xml 
SET @xml = 
'<GespeicherteDaten> 
<strategieWuerfelFelder Type="strategieWuerfelFelder"> 
    <Felder X="3" Y="3" Z="3"> 
     <Feld X="1" Y="1" Z="1"> 
      <strategieWuerfelFeld Type="strategieWuerfelFeld"> 
       <Name>Name</Name> 
       <Beschreibung>Test</Beschreibung> 
      </strategieWuerfelFeld> 
     </Feld> 
     <Feld X="1" Y="1" Z="2"> 
      <strategieWuerfelFeld Type="strategieWuerfelFeld"> 
       <Name>Name2</Name> 
       <Beschreibung>Test2</Beschreibung> 
      </strategieWuerfelFeld> 
     </Feld> 
    </Felder> 
</strategieWuerfelFelder></GespeicherteDaten>' 

SELECT 
    b.value('@X', 'int') as X 
    , b.value('@Y', 'int') as Y 
    , b.value('@Z', 'int') as Z 
    , b.value('(./strategieWuerfelFeld/Name/text())[1]','Varchar(50)') as [Name] 
    , b.value('../@X','int') as Felder_X 
    , b.value('../@Y','int') as Felder_Y 
    , b.value('../@Z','int') as Felder_Z 
FROM @xml.nodes('/GespeicherteDaten/strategieWuerfelFelder/Felder/Feld') as a(b) 
+0

कि काम करता है धन्यवाद। धन्यवाद –

+0

उत्कृष्ट, लघु और बिंदु पर। मैं इसे बिना किसी विचार के उपयोग करने में सक्षम था जो हमेशा अच्छा होता है :-) –

+0

'ए (बी)' वाक्यविन्यास क्या कर रहा है? – Thomas

5
declare @XML xml 
set @XML = ' 
<GespeicherteDaten> 
    <strategieWuerfelFelder Type="strategieWuerfelFelder"> 
     <Felder X="3" Y="3" Z="3"> 
      <Feld X="1" Y="1" Z="1"> 
       <strategieWuerfelFeld Type="strategieWuerfelFeld"> 
        <Name>Name</Name> 
        <Beschreibung>Test</Beschreibung> 
       </strategieWuerfelFeld> 
      </Feld> 
      <Feld X="1" Y="1" Z="2"> 
       <strategieWuerfelFeld Type="strategieWuerfelFeld"> 
        <Name>Name2</Name> 
        <Beschreibung>Test2</Beschreibung> 
       </strategieWuerfelFeld> 
      </Feld> 
     </Felder> 
    </strategieWuerfelFelder> 
</GespeicherteDaten>' 


select Felder.N.value('@X', 'int') as Felder_X, 
     Felder.N.value('@Y', 'int') as Felder_Y, 
     Felder.N.value('@Z', 'int') as Felder_Z, 
     Feld.N.value('@X', 'int') as Feld_X, 
     Feld.N.value('@Y', 'int') as Feld_Y, 
     Feld.N.value('@Z', 'int') as Feld_Z, 
     Feld.N.value('(strategieWuerfelFeld/Name/text())[1]', 'nvarchar(100)') as Name 
from @XML.nodes('/GespeicherteDaten/strategieWuerfelFelder/Felder') as Felder(N) 
    cross apply Felder.N.nodes('Feld') as Feld(N) 

परिणाम:

Felder_X Felder_Y Felder_Z Feld_X  Feld_Y  Feld_Z  Name 
----------- ----------- ----------- ----------- ----------- ----------- --------- 
3   3   3   1   1   1   Name 
3   3   3   1   1   2   Name2 
+0

बढ़िया, आप –

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