2013-03-28 14 views
19

Die XML sieht wie folgt aus:Parse XML in SQL Server

<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>' 

Mein Ergebnistabelle die Attribute enthalten sollte Felder-> X, Y, Z, Feld-> X, Y, Z und Namen.

Like:

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

Ist es möglich, diese Werte aus einer Abfrage oder gespeicherte Prozedur direkt zu bekommen?

Antwort

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

, das funktioniert. danke –

+0

ausgezeichnet, kurz und auf den Punkt. Ich konnte dies ohne viel Nachdenken nutzen, was immer schön ist :-) –

+0

Was macht die 'a (b)' Syntax? – 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) 

Ergebnis:

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

Groß, danke –