2017-03-25 2 views
-1

Ich habe hier einen kleinen Auszug der XML-Dateien werde ich behandeln müssen:Erste XML-Knoten-Wert und alle verschachtelten Spalte Knoten

<garRoot fileMaster="9371034.0582.30582"> 
    <garTransactions> 
    <garTransaction InnerTransId="89274503"> 
     <garSection> 
     <garSectionCounterFName /> 
     <garColumns /> 
     <garSection> 
      <garSectionName>Header Section</ChapterName> 
      <garSectionCounterFName /> 
      <garColumns /> 
      <garSection> 
      <garSectionName>Startup</ChapterName> 
      <garSectionCounterFName /> 
      <garColumns> 
       <garColumn> 
       <garColText>Idea Date:</garColText> 
       <garColVal>2017-03-22</garColVal> 
       </garColumn> 
       <garColumn> 
       <garColText>Idea Name:</garColText> 
       <garColVal>The Invisible Cloak</garColVal> 
       </garColumn> 
      </garColumns> 
      </garSection> 

ich einige Code versucht haben, um zu versuchen:

  1. starten für jede garTransaction die InnerTransId Werte mit bekommen:

    SELECT T.value('./@InnerTransID','varchar(50)') As InnerTransID FROM @XML.nodes('//garTransaction') AS GarT(T)

  2. Denn in Wirklichkeit hat es garSection in anderen garSection verschachtelt worden Ich habe versucht, alle garColText und garColVal über garColumn zu erhalten:

    SELECT C.query('./garColText') As cText , C.query('./garColVal') As cVal FROM @XML.nodes('//garColumn') as garC(C)

Wo ich Probleme habe, ist, als Beispiel Ich weiß, dass ich 145 Spalten für jede Transaktionsidentifikation habe, aber ich kann nicht scheinen, die Daten zusammen zu verbinden, da ich zurückgegeben werden müsste:

InnerTransId cText  cVal 
--------------- ----------- ------------------- 
89274503  Idea Date: 2017-03-22 
89274503  Idea Name: The Invisible Cloak 

Antwort

1

Sie können CROSS APPLY oder OUTER APPLY zu diesem Zweck verwendet werden:

SELECT 
    T.value('@InnerTransID','varchar(50)') As InnerTransID 
    , C.value('garColText[1]','varchar(max)') As cText 
    , C.value('garColVal[1]','varchar(max)') As cVal 
FROM @XML.nodes('//garTransaction') AS GarT(T) 
    OUTER APPLY T.nodes('.//garColumn') as garC(C) 

Beachten Sie, wie nodes('.//garColumn') auf T genannt wurde, so dass das Ergebnis, garC(C), nur garColumn enthält, die den aktuellen garTransaction bezogen.

+0

Vielen Dank !!! Die Abfrage funktionierte perfekt; jetzt versuche ich es nur zu verstehen ~ Ich hoffe, ich kann noch ein paar Fragen stellen, während ich mit der SQL-Anweisung herumspiele? -> Ich hatte gestern eine äußere Anwendung versucht, die gerade 10x mehr Reihen zurückgab! – Busy

Verwandte Themen