Kann nur den ersten datasatz unter dem Tag aus der Variable xml abholen

Ich würde es schätzen, dass jemand mir dabei hilft. Manchmal bekomme ich die gleiche ID in allen Ergebnissen und ich kann nie die 2. Aufzeichnung (Staffelung), nur die 1..

xml-Format ist das folgende: datasatz-Tags können einen oder mehrere DOCTORAL-Tags enthalten:

<Record username=<"erttt"> <DOCTORAL> <PROGRAM>Program Name 1</PROGRAM> <MILESTONE>Entered Program</MILESTONE> <DTM_DATE>August</DTM_DATE> <DTD_DATE>24</DTD_DATE> <DTY_DATE>2015</DTY_DATE> </DOCTORAL> </Record> <Record> username=<"xxxgh"> <DOCTORAL> <PROGRAM>Program Name 2</PROGRAM> <MILESTONE>Entered Program</MILESTONE> <DTM_DATE>Jan</DTM_DATE> <DTD_DATE>2</DTD_DATE> <DTY_DATE>2014</DTY_DATE> </DOCTORAL> <DOCTORAL> <PROGRAM>Program Name 2</PROGRAM> <MILESTONE>Graduated</MILESTONE> <DTM_DATE>August</DTM_DATE> <DTD_DATE>26</DTD_DATE> <DTY_DATE>2016</DTY_DATE> </DOCTORAL> </Record> 

Ich möchte das Ergebnis wie:

  username Program Milestone erttt Program Name 1 Entered Program xxxgh Program Name 2 Entered Program xxxgh Program Name 2 Graduated 

so gäbe es 3 Aufzeichnungen aus dem oben genannten.

Das folgende funktioniert nicht, und ich habe viele verschiedene Kombinationen ausprobiert und habe auf dieser Seite Beispiele gefunden. Kann es einfach nicht herausfinden …

 SELECT x.value('(//Record/@username)[1]','varchar(50)') AS username, --'@username','varchar(50)' DOESN'T WORK HERE c.value('(//Record/DOCTORAL/PROGRAM)[1]','varchar(200)') as PROGRAM, c.value('(//Record/DOCTORAL/MILESTONE)[1]','varchar(50)') as MILESTONE, c.value('(//Record/DOCTORAL/DTM_DATE)[1]','varchar(8)') as DTM_DATE, --DTM_DATE c.value('(//Record/DOCTORAL/DTD_DATE)[1]','varchar(2)') as DTD_DATE, --DTD_DATE c.value('(//Record/DOCTORAL/DTY_DATE)[1]','varchar(4)') as DTY_DATE --DTY_DATE from @xmlDocPrelim.nodes('//Record') t(x) -- if ends with 'Record', then same id in all recs; if ends in DOCTORAL, then not. In either case, no grad recs cross apply x.nodes('./DOCTORAL')r(c) 

Zuerst gibt es Syntaxerrors in deinem XML. Nach dem Fix gibt der folgende Code was du willst.

 declare @x xml= '<Record username="erttt"> <DOCTORAL> <PROGRAM>Program Name 1</PROGRAM> <MILESTONE>Entered Program</MILESTONE> <DTM_DATE>August</DTM_DATE> <DTD_DATE>24</DTD_DATE> <DTY_DATE>2015</DTY_DATE> </DOCTORAL> </Record> <Record username="xxxgh"> <DOCTORAL> <PROGRAM>Program Name 2</PROGRAM> <MILESTONE>Entered Program</MILESTONE> <DTM_DATE>Jan</DTM_DATE> <DTD_DATE>2</DTD_DATE> <DTY_DATE>2014</DTY_DATE> </DOCTORAL> <DOCTORAL> <PROGRAM>Program Name 2</PROGRAM> <MILESTONE>Graduated</MILESTONE> <DTM_DATE>August</DTM_DATE> <DTD_DATE>26</DTD_DATE> <DTY_DATE>2016</DTY_DATE> </DOCTORAL> </Record>' select tvvalue('../@username','varchar(20)') username, tvvalue('PROGRAM[1]','varchar(20)') Program, tvvalue('MILESTONE[1]','varchar(20)') Milestone from @x.nodes('//DOCTORAL') t(v) 

Ich glaube, das ist die Syntax, die du brauchst

 declare @xmlDocPrelim as xml set @xmlDocPrelim = '<Record username="erttt"> <DOCTORAL> <PROGRAM>Program Name 1</PROGRAM> <MILESTONE>Entered Program</MILESTONE> <DTM_DATE>August</DTM_DATE> <DTD_DATE>24</DTD_DATE> <DTY_DATE>2015</DTY_DATE> </DOCTORAL> </Record> <Record username="xxxgh"> <DOCTORAL> <PROGRAM>Program Name 2</PROGRAM> <MILESTONE>Entered Program</MILESTONE> <DTM_DATE>Jan</DTM_DATE> <DTD_DATE>2</DTD_DATE> <DTY_DATE>2014</DTY_DATE> </DOCTORAL> <DOCTORAL> <PROGRAM>Program Name 2</PROGRAM> <MILESTONE>Graduated</MILESTONE> <DTM_DATE>August</DTM_DATE> <DTD_DATE>26</DTD_DATE> <DTY_DATE>2016</DTY_DATE> </DOCTORAL> </Record> ' select @xmlDocPrelim SELECT x.value('@username','varchar(50)') AS username, c.value('./PROGRAM[1]','varchar(200)') as PROGRAM, c.value('./MILESTONE[1]','varchar(50)') as MILESTONE, c.value('./DTM_DATE[1]','varchar(8)') as DTM_DATE, c.value('(./DTD_DATE)[1]','varchar(2)') as DTD_DATE, c.value('(./DTY_DATE)[1]','varchar(4)') as DTY_DATE from @xmlDocPrelim.nodes('//Record') t(x) cross apply x.nodes('DOCTORAL') r(c) 

Ergebnisse:

 username PROGRAM MILESTONE DTM_DATE DTD_DATE DTY_DATE ---------- ----------------- ------------------- -------- -------- -------- erttt Program Name 1 Entered Program August 24 2015 xxxgh Program Name 2 Entered Program Jan 2 2014 xxxgh Program Name 2 Graduated August 26 2016