MSSQL 2008 получить все уровни предмета - PullRequest
2 голосов
/ 08 июня 2011

скажем, у меня есть xml в поле типа SQL xml, например:

    @x='<root>
         <item>
           <title></title>
           <item>
             <title></title>
           </item>
         </item>
       </root>'

Как мне получить элементы n-го уровня в запросе?

Очевидно, что для получения первого уровня вы быиспользуйте;

    select
     t.p.query('.')
    from
     @x.nodes('/root/item') t(p)

и чтобы получить следующий уровень, вы бы добавили

    cross apply
         @x.nodes('/root/item/item')

, но во время выполнения мы не знаем глубину, на которую может пойти xml.

Может ли кто-нибудь направить меня в правильном направлении.

Спасибо!

1 Ответ

2 голосов
/ 08 июня 2011

Если вам нужны все узлы элементов, вы можете сделать это так

select t.p.query('.')
from @x.nodes('//item') t(p)

Результат:

(No column name)
<item><title /><item><title /></item></item>
<item><title /></item>

Если вам нужен только самый внутренний элемент, вы можете сделать это следующим образом

select
  t.p.query('.')
from @x.nodes('//item[count(item) = 0]') t(p)

Результат:

(No column name)
<item><title /></item>
...