Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 выборка из .xml документа  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Из БД подтягивается данные, из столбца типа XML... в нем есть теги:
        '<Документ5>
            <Документ4>
               <Документ3>
                  <Документ2>
                     <Документ1>
                     </Документ1>
                  </Документ2>
               </Документ3>
            </Документ4>
          </Документ5>'

Бывает что тег <Документ1> повторяется, несколько раз...
        '<Документ5>
            <Документ4>
               <Документ3>
                  <Документ2>
                     <Документ1>
                     </Документ1>
                     <Документ1>
                     </Документ1>
                     ...
                  </Документ2>
               </Документ3>
            </Документ4>
          </Документ5>'

Как подсчитать количество тегов <Документ1> ?
20 май 14, 13:33    [16042362]     Ответить | Цитировать Сообщить модератору
 Re: выборка из .xml документа  [new]
Кавказ-сила
Member

Откуда: Москва
Сообщений: 261
declare @x xml = 
N'<Документ5>
            <Документ4>
               <Документ3>
                  <Документ2>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                  </Документ2>
               </Документ3>
            </Документ4>
          </Документ5>'
          
select count(*)
from @x.nodes(N'/Документ5/Документ4/Документ3/Документ2/Документ1') t(x)
20 май 14, 13:40    [16042418]     Ответить | Цитировать Сообщить модератору
 Re: выборка из .xml документа  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Кавказ-сила,

Спасибо, то что нужно!

Можно еще такой вопрос: Как обращаться к тэгу <Документ1>, если их несколько, а мне нужен второй по порядку или третий ?

Для примера в операторе CASE :

SELECT

,CASE WHEN <Документ1></Документ1> THEN Document1 END AS Colum1
,CASE WHEN <Документ1></Документ1> THEN Document2 END AS Colum2
,CASE WHEN <Документ1></Документ1> THEN Document3 END AS Colum3
,CASE WHEN <Документ1></Документ1> THEN Document4 END AS Colum4 

FROM Table1 T
WHERE T.ID=@dID
20 май 14, 14:06    [16042598]     Ответить | Цитировать Сообщить модератору
 Re: выборка из .xml документа  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6116
Кавказ-сила
declare @x xml = 
N'<Документ5>
            <Документ4>
               <Документ3>
                  <Документ2>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                  </Документ2>
               </Документ3>
            </Документ4>
          </Документ5>'
          
select count(*)
from @x.nodes(N'/Документ5/Документ4/Документ3/Документ2/Документ1') t(x)

declare @x xml = 
N'<Документ5>
            <Документ4>
               <Документ3>
                  <Документ2>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                     <Документ1></Документ1>
                  </Документ2>
               </Документ3>
            </Документ4>
          </Документ5>'
select @x.query(N'count(/Документ5/Документ4/Документ3/Документ2/Документ1)').value('.', 'int')

Aleks_Aleks
Как обращаться к тэгу <Документ1>, если их несколько, а мне нужен второй по порядку или третий ?

1. Использовать XPath indexers:
select
  t.x.value('Документ1[3]', 'varchar(10)')
from @x.nodes(N'/Документ5/Документ4/Документ3/Документ2') t(x)

В XPath индексаторы one-based, если что.

2. Пронумеровать ноды через row_number (правда, вроде как нет никакой гарантии, что в SQL-ной выборке siblings будут в том же порядке, что и в исходном XML)
20 май 14, 15:18    [16043132]     Ответить | Цитировать Сообщить модератору
 Re: выборка из .xml документа  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Сон Веры Павловны,

Спасибо, все необходимое есть.

Еще небольшое уточнение, что такое t(x) ?
20 май 14, 16:49    [16043755]     Ответить | Цитировать Сообщить модератору
 Re: выборка из .xml документа  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6116
Aleks_Aleks,

t - алиас для табличной функции, (x) - список полей, возвращаемых функцией (в данном случае одно поле). Поскольку nodes() возвращает безымянный результат, то он должен быть именован, а поскольку список результирующих полей нельзя задать без алиаса функции, то указание t(x) обязательно (сами буквы при этом могут быть любыми - т.е. наряду с t(x) допустимо и f(n), и myfunction(myfield), и т.п.)
20 май 14, 17:15    [16043944]     Ответить | Цитировать Сообщить модератору
 Re: выборка из .xml документа  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Сон Веры Павловны,

Теперь совсем все хорошо)

Всем огромное СПС за помощь.
20 май 14, 17:56    [16044280]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить