Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
FoR Member Откуда: Москва Сообщений: 5 |
Всем доброго вечера. Помогите пожалуйста написать запрос к xml. Надо вывести значения атрибутов в блоке client_actions: id и checked по заданному person id Пытался сделать как то так: select @resXML.value('/request/person/client_actions', 'varchar(23)') where @resXML.exist('/request/person/id[text() = "1"]') = 1 Хотел данным запросом вернуть резалтсет вида: 1 1 2 0 3 1 Не срастется( Пример хмл: <request> <person> <id>1<id/> <client_actions> <action id="1" checked = "1"/> <action id="2" checked = "0"/> <action id="3" checked = "1"/> </client_actions> </person> <person> <id>2<id/> <client_actions> <action id="1" checked = "1"/> <action id="2" checked = "0"/> <action id="3" checked = "1"/> </client_actions> </person> </request> |
30 июл 13, 22:03 [14639903] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
это чё такое ?? --- declare @xml xml set @xml = '<request> <person> <id>1</id> <client_actions> <action id="1" checked = "1"/> <action id="2" checked = "0"/> <action id="3" checked = "1"/> </client_actions> </person> <person> <id>2</id> <client_actions> <action id="1" checked = "1"/> <action id="2" checked = "0"/> <action id="3" checked = "1"/> </client_actions> </person> </request>' set @xml = (select @xml.query('//person[id=1]')) select t.c.value('@id', 'int') as id, t.c.value('@checked', 'int') as checked from @xml.nodes('/person/client_actions/action') t(c) id checked ----------- ----------- 1 1 2 0 3 1 (3 row(s) affected) |
||||
30 июл 13, 22:42 [14640097] Ответить | Цитировать Сообщить модератору |
FoR Member Откуда: Москва Сообщений: 5 |
qwerty112, спасибо, да все верно
это я доупрощался:) если знаете что почитать по таким запросам подскажите плиз кроме мсдн) для меня запросы к xml всегда темным лесом были(( |
||
30 июл 13, 23:02 [14640196] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
даа, для меня, честно говоря - тоже )) вот наверняка жж, можно обойтись без промеж. присваивания, set @xml = .... - но у меня не получилось ... |
||
30 июл 13, 23:17 [14640253] Ответить | Цитировать Сообщить модератору |
FoR Member Откуда: Москва Сообщений: 5 |
у меня тоже, как и set @xml = (select @xml.query('//person[id=1]')) попытка задать условие id=1 в переменной мсдн советует сделать что то вроде: declare @id int set @id = 1 set @xml = (select @xml.query('//person[id={ sql:variable("@id") }]')) но парсер ругается |
30 июл 13, 23:29 [14640332] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9632 |
select t.c.value('@id', 'int') as id, t.c.value('@checked', 'int') as checked from @xml.nodes('/request/person[id = "1"]/client_actions/action') t(c) |
30 июл 13, 23:31 [14640348] Ответить | Цитировать Сообщить модератору |
FoR Member Откуда: Москва Сообщений: 5 |
invm, Спасибо за альтернативный вариант, но та же проблема, как использовать в условии id=1 переменную? |
30 июл 13, 23:35 [14640360] Ответить | Цитировать Сообщить модератору |
qwerty112
Guest |
так, а вам сильно принципиально что бы условие было именно в XQuery ? так не устроит ? select t.c.value('@id', 'int') as id, t.c.value('@checked', 'int') as checked from @xml.nodes('/request/person/client_actions/action') t(c) where t.c.value('../../id[1]', 'int') = @id |
||
31 июл 13, 00:01 [14640448] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9632 |
declare @id int = 1; select t.c.value('@id', 'int') as id, t.c.value('@checked', 'int') as checked from @xml.nodes('/request/person[id = sql:variable("@id")]/client_actions/action') t(c) |
||
31 июл 13, 00:07 [14640467] Ответить | Цитировать Сообщить модератору |
FoR Member Откуда: Москва Сообщений: 5 |
invm, спасибо, помогло) |
31 июл 13, 00:31 [14640522] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |