Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 XQuery запрос.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
qwerty112
Guest
FoR
Всем доброго вечера.
Помогите пожалуйста написать запрос к 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>


автор
Пример хмл:

<id>1<id/>
....
<id>2<id/>

это чё такое ??

---
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]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
FoR
Member

Откуда: Москва
Сообщений: 5
qwerty112, спасибо, да все верно

автор
это чё такое ??

это я доупрощался:)

если знаете что почитать по таким запросам подскажите плиз кроме мсдн)
для меня запросы к xml всегда темным лесом были((
30 июл 13, 23:02    [14640196]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
qwerty112
Guest
FoR
для меня запросы к xml всегда темным лесом были((

даа, для меня, честно говоря - тоже ))
вот наверняка жж, можно обойтись без промеж. присваивания, set @xml = .... - но у меня не получилось ...
30 июл 13, 23:17    [14640253]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
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]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
FoR
Member

Откуда: Москва
Сообщений: 5
invm,

Спасибо за альтернативный вариант, но та же проблема, как использовать в условии
id=1 переменную?
30 июл 13, 23:35    [14640360]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
qwerty112
Guest
FoR
invm,

Спасибо за альтернативный вариант, но та же проблема, как использовать в условии
id=1 переменную?

так, а вам сильно принципиально что бы условие было именно в 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]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
invm
Member

Откуда: Москва
Сообщений: 9915
FoR
как использовать в условии id=1 переменную?
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]     Ответить | Цитировать Сообщить модератору
 Re: XQuery запрос.  [new]
FoR
Member

Откуда: Москва
Сообщений: 5
invm,

спасибо, помогло)
31 июл 13, 00:31    [14640522]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить