2015-04-24 4 views
1

Я получаю XML-строку для многих таблиц. Проблема заключается в том, что вместо иметь этот форматПолучить все узлы XML, которые содержат определенный внутренний узел в T-SQL

<root> 
    <Candy> 
    <Name>M-M</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> 

Что я получаю

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

Мне нужно вставить строки конфеты в таблице конфеты и строки для фруктов в таблице фруктов. Если бы я получил первый формат, я бы просто сделать

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

, и я хотел бы получить все конфеты строки, но ребята с другой стороны веб-службы не хотят, чтобы отправить его таким образом. Итак, прежде чем я поставил бой, есть ли способ получить все Candy, используя второй формат xml? например, запрашивать все узлы с внутренним узлом с именем «Размер»? Я использую SQLServer 2008, поэтому я могу использовать либо инструкцию openxml, либо новые функции узла, которые я еще не научился использовать. Кроме того, скорость процесса является более важным, чем память, я думаю ...

ответ

3

Вы можете попробовать этот способ:

declare @T xml = '<root> 
    <Candy> 
    <M-M> 
     <Size>Small</Size> 
    </M-M> 
    <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 Fiddle

В root/Candy/*[Size] средства XPath получить все дочерние узлы <Candy>, независимо от его названия, имея ребенка <Size>.

Смежные вопросы