2013-03-28 63 views
19

的XML看起来是这样的:解析XML在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>' 

我的结果表应包含的属性Felder-> X,Y,Z,Feld-> X,Y,Z和名称。

像:

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

的作品。谢谢 – 2013-03-28 17:06:35

+0

优秀,简短和重点。我能够毫不费力地利用它,这总是很好:-) – 2013-12-15 21:45:12

+0

什么是a(b)语法在做什么? – Thomas 2018-01-10 15:53:22

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

太好了,谢谢你 – 2013-03-28 17:06:08