MSSQL 2008 получает все уровни элемента

#tsql #xquery-sql

#tsql #xquery-sql

Вопрос:

допустим, у меня есть 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:

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

 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>
  

Комментарии:

1. вау, действительно так просто, просто дополнительная косая черта! большое спасибо!