Formatieren von XML in eine select-statement

DECLARE @Data AS XML = ' <Catalog> <Artist> <name>Wolfgang</name> <name>Razorback</name> </Artist> <Album> <Category>Rock</Category> <Category>Alternative</Category> </Album> </Catalog>' SELECT B.value('(text())[1]','varchar(15)') as Artist, C.value('(text())[1]','varchar(15)') as Album FROM @Data.nodes('/Catalog') AS Catalog(A) CROSS APPLY A.nodes('Artist/name') as Artist(B) CROSS APPLY A.nodes('Album/Category') as Album(C) 

Ich erwartete, dass das Ergebnis so sein sollte, ich möchte einfach den Künstler als erster Colum und Album als zweite Spalte machen

Bildbeschreibung hier eingeben

aber es hat diese Abfrage zurückgegeben,

Bildbeschreibung hier eingeben

Dein xml ist nicht sehr gut du kannst das:

 ;with cte_artist as ( select row_number() over(order by (select '1')) as rn, TCvalue('text()[1]','varchar(15)') as Artist from @Data.nodes('/Catalog/Artist/name') as T(C) ), cte_album as ( select row_number() over(order by (select '1')) as rn, TCvalue('text()[1]','varchar(15)') as Album from @Data.nodes('/Catalog/Album/Category') as T(C) ) select a1.Artist, a2.Album from cte_artist as a1 full outer join cte_album as a2 on a2.rn = a1.rn 

sql Geige Demo

Aber besser wäre es, xml so zu erstellen (oder irgendeine andere verschachtelte Art, die du willst):

 <Catalog> <Album name="Rock album"> <Category>Rock</Category> <Artist name="Wolfgang"/> </Album> <Album name="Alternative album"> <Category>Alternative</Category> <Artist name="Razorback"/> </Album> </Catalog> 

So könntest du es so abfragen:

 select TCvalue('@name','varchar(15)') as name, TCvalue('(Category/text())[1]','varchar(15)') as Category, TCvalue('Artist[1]/@name','varchar(15)') as Artist from @Data.nodes('/Catalog/Album') as T(C)