2013-03-28 33 views
19

XML şöyle görünür:XML ayrıştırma, 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>' 

Benim sonuç tablosu özelliklerini Felder-> X, Y, Z, Feld-> X, Y, Z ve Adı içermelidir.

gibi:

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

bir sorgu veya saklı yordam doğrudan bu değerleri elde etmek mümkün mü?

cevap

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

teşekkür ederim. –

+0

mükemmel, kısa ve noktaya teşekkür ederim. Her zaman güzel olan çok düşünmeden bunu kullanabildim :-) –

+0

'a (b)' sözdizimi ne yapıyor? – 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) 

Sonuç:

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

Büyük, size çalışır –