Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Кавказ-сила 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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны 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 @x.query(N'count(/Документ5/Документ4/Документ3/Документ2/Документ1)').value('.', 'int')
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] Ответить | Цитировать Сообщить модератору |
Aleks_Aleks Member Откуда: Сообщений: 294 |
Сон Веры Павловны, Спасибо, все необходимое есть. Еще небольшое уточнение, что такое t(x) ? |
20 май 14, 16:49 [16043755] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6116 |
Aleks_Aleks, t - алиас для табличной функции, (x) - список полей, возвращаемых функцией (в данном случае одно поле). Поскольку nodes() возвращает безымянный результат, то он должен быть именован, а поскольку список результирующих полей нельзя задать без алиаса функции, то указание t(x) обязательно (сами буквы при этом могут быть любыми - т.е. наряду с t(x) допустимо и f(n), и myfunction(myfield), и т.п.) |
20 май 14, 17:15 [16043944] Ответить | Цитировать Сообщить модератору |
Aleks_Aleks Member Откуда: Сообщений: 294 |
Сон Веры Павловны, Теперь совсем все хорошо) Всем огромное СПС за помощь. |
20 май 14, 17:56 [16044280] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |