Holen Sie alle XML-Knoten, die einen bestimmten inneren Knoten in T-SQL enthalten

Ich erhalte eine XML-String-Information für viele Tabellen. Das Problem ist, dass anstatt das Format zu haben

<root> <Candy> <Name>MM</Name> <Size>Small</Size> </Candy> <Candy> <Name>KitKat</Name> <Size>Medium</Size> </Candy> <Fruit> <Description>Banana</Description> <Color>Yellow</Color> </Fruit> <Fruit> <Description>Cherry</Description> <Color>Red</Color> </Fruit> <root> 

Was ich bekomme ist

 <root> <Candy> <MM> <Size>Small</Size> </MM> <KitKat> <Size>Medium</Size> <KitKat> </Candy> <Fruit> <Banana> <Color>Yellow</Color> </Banana> <Cherry> <Color>Red</Color> </Cherry> </Fruit> </root> 

Ich muss die Zeilen für Süßigkeiten in den Tisch legen Süßigkeiten und die Zeilen für Früchte in der Tabelle Obst. Wenn ich das erste Format erhielt, das ich einfach tun würde

  select * from openxml (@hDoc, '/root/Candy', 2) 

und ich würde alle Süßigkeiten Reihen bekommen, aber die Jungs von der anderen Seite des Web-Service sind zögern, es so zu schicken. Also, bevor ich einen Kampf, gibt es einen path, um alle Candy mit dem zweiten XML-Format? wie die Anforderung aller Knoten, die einen inneren Knoten namens Größe haben? Ich benutze SQLserver 2008, damit ich entweder die openxml-statement oder die neueren Knotenfunktionen verwenden kann, die ich noch nicht gelernt habe, wie man es benutzt. Auch processgeschwindigkeit ist wichtiger als Gedächtnis, denke ich …

Du kannst so versuchen:

 declare @T xml = '<root> <Candy> <MM> <Size>Small</Size> </MM> <KitKat> <Size>Medium</Size> </KitKat> </Candy> <Fruit> <Banana> <Color>Yellow</Color> </Banana> <Cherry> <Color>Red</Color> </Cherry> </Fruit> </root>' select candies.X.value('local-name(.)', 'varchar(100)') as Name , candies.X.value('Size[1]', 'varchar(100)') as Size from @T.nodes('root/Candy/*[Size]') as candies(X) 

SQL-Geige

Die xpath root/Candy/*[Size] bedeutet, dass alle Kind-Knoten von <Candy> , was auch immer es ist Name, mit Kind <Size> .