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

Откуда:
Сообщений: 2528
Доброго дня господа !
Подскажите пожалуйста сделать запрос

Есть исходнык XML
<Field Type="Choice" 
  Name="Parent" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код родительского проекта">
  <CHOICES>
     <CHOICE>123</CHOICE>
     <CHOICE>456</CHOICE>
     <CHOICE>789</CHOICE>
  </CHOICES>
</Field>
<Field 
  Type="Choice” 
  Name="Child" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код дочернего проекта">
  <CHOICES>
     <CHOICE>A1</CHOICE>
     <CHOICE>A2</CHOICE>
     <CHOICE>A3</CHOICE>
  </CHOICES>
</Field>



Необходимо получить результат
F1
-----
A1
A2
A3


Логика отбора Name='Child' отобрать все записи записи в секции <CHOICES>

Заранее благодарен !
14 июн 13, 13:52    [14433660]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
select n.value('text()[1]', 'nvarchar(255)')
  from @xml.nodes('/Field[@Name="Child"]/CHOICES/CHOICE') as t(n)


А пихание в форум неправильных кавычек - некультурно!
14 июн 13, 13:57    [14433707]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
declare @x xml = '<Field Type="Choice" 
  Name="Parent" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код родительского проекта">
  <CHOICES>
     <CHOICE>123</CHOICE>
     <CHOICE>456</CHOICE>
     <CHOICE>789</CHOICE>
  </CHOICES>
</Field>
<Field 
  Type="Choice" 
  Name="Child" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код дочернего проекта">
  <CHOICES>
     <CHOICE>A1</CHOICE>
     <CHOICE>A2</CHOICE>
     <CHOICE>A3</CHOICE>
  </CHOICES>
</Field>'

select
 n.value('.', 'varchar(30)')
from
 @x.nodes('/Field[@Name = "Child"]/CHOICES/CHOICE') t(n);
14 июн 13, 14:01    [14433747]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
HOME_X
Member

Откуда:
Сообщений: 2528
invm,
@x.nodes('/Field[@Name = "Child"]/CHOICES/CHOICE') t(n);

Понял - спасибо !
14 июн 13, 14:10    [14433820]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Паганель
n.value('text()[1]', 'nvarchar(255)')

invm
n.value('.', 'varchar(30)')

Тоже написал запрос "с точкой", как во втором случае. А что правильнее — text()[1] или точка?
14 июн 13, 14:14    [14433853]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
HOME_X
Member

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

Еще момент, а MSQL2008 (в разрезе направления XML) - рееестрозависимый ?

Работает
select n.value('.', 'varchar(30)') List
  from @xmlBase.nodes('/Field[@DisplayName = "Parent Project"]/CHOICES/CHOICE') t(n); 


Изменил реестр символа n.Value - не работает ????
select n.Value('.', 'varchar(30)') List
  from @xmlBase.nodes('/Field[@DisplayName = "Parent Project"]/CHOICES/CHOICE') t(n); 
14 июн 13, 14:16    [14433884]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Гость333
Member

Откуда:
Сообщений: 3683
HOME_X
рееестрозависимый

регистрозависимый

HOME_X
реестр символа

регистр символа

Да, регистрозависимый.
14 июн 13, 14:24    [14433949]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
HOME_X
Member

Откуда:
Сообщений: 2528
Гость333,

Гм !!!!?????

Принято - спасибо
14 июн 13, 14:33    [14434031]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Паганель
select n.value('text()[1]', 'nvarchar(255)')
  from @xml.nodes('/Field[@Name="Child"]/CHOICES/CHOICE') as t(n)


А пихание в форум неправильных кавычек - некультурно!


да, это невпихуемое
14 июн 13, 14:46    [14434139]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
HOME_X
Member

Откуда:
Сообщений: 2528
Winnipuh
А пихание в форум неправильных кавычек - некультурно!

[/quot]

Пожалуйста поясните - не совсем Вас понял ?
Какой именно символ нельзя использовать ?
14 июн 13, 14:55    [14434206]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
HOME_X
Member

Откуда:
Сообщений: 2528
А если мне необходимо добавить строку средствами MSQL2008
<CHOICE>A4</CHOICE>
Как это будет выглядить ?

declare @x xml = '<Field 
  Type="Choice" 
  Name="Child" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код дочернего проекта">
  <CHOICES>
     <CHOICE>A1</CHOICE>
     <CHOICE>A2</CHOICE>
     <CHOICE>A3</CHOICE>
     <CHOICE>A4</CHOICE>
  </CHOICES>
</Field>'
14 июн 13, 14:57    [14434216]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Гость333
Member

Откуда:
Сообщений: 3683
declare @x xml = '<Field Type="Choice" 
  Name="Parent" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код родительского проекта">
  <CHOICES>
     <CHOICE>123</CHOICE>
     <CHOICE>456</CHOICE>
     <CHOICE>789</CHOICE>
  </CHOICES>
</Field>
<Field 
  Type="Choice" 
  Name="Child" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код дочернего проекта">
  <CHOICES>
     <CHOICE>A1</CHOICE>
     <CHOICE>A2</CHOICE>
     <CHOICE>A3</CHOICE>
  </CHOICES>
</Field>'


set @x.modify('insert <CHOICE>A4</CHOICE> as last into (Field[@Name="Child"]/CHOICES)[1]');

select @x;
14 июн 13, 15:04    [14434248]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Гость333
Member

Откуда:
Сообщений: 3683
HOME_X
Паганель
А пихание в форум неправильных кавычек - некультурно!

Пожалуйста поясните - не совсем Вас понял ?
Какой именно символ нельзя использовать ?

У вас была "косая кавычка", из-за которой поплыл XML:
Type="Choice”
14 июн 13, 15:06    [14434263]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Тоже написал запрос "с точкой", как во втором случае. А что правильнее — text()[1] или точка?

если не критична разница в результатах:

declare @x xml = '<Field Type="Choice" 
  Name="Parent" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код родительского проекта">
  <CHOICES>
     <CHOICE>123</CHOICE>
     <CHOICE>456</CHOICE>
     <CHOICE>789</CHOICE>
  </CHOICES>
</Field>
<Field 
  Type="Choice" 
  Name="Child" 
  Required="TRUE" 
  Format="Dropdown" 
  Description="Выберите код дочернего проекта">
  <CHOICES>
     <CHOICE></CHOICE>
     <CHOICE>A2<C>asdf</C>fff</CHOICE>
     <CHOICE>A3</CHOICE>
  </CHOICES>
</Field>'

select
 n.value('.', 'varchar(30)')
from
 @x.nodes('/Field[@Name = "Child"]/CHOICES/CHOICE') t(n);

select
 n.value('text()[1]', 'varchar(30)')
from
 @x.nodes('/Field[@Name = "Child"]/CHOICES/CHOICE') t(n);


то лучше text()[1] - заметно полегче получается.
вот, попробовать можно:
set statistics time on ;
set statistics io on ;

declare @x xml 
set @x = ( select top 10000
                  o.object_id ID
           from   sys.objects as o cross join sys.objects o2
         for
           xml path('IDs')
             , root('List')
         )

declare @t datetime
set @t = getdate()

select  z.z.value('text()[1]', 'bigint')
from    @x.nodes('List/IDs/ID') z ( z )

print 'Ver 2'

select datediff(ms, @t, getdate())
set @t = getdate()

select  z.z.value('.', 'bigint')
from    @x.nodes('List/IDs/ID') z ( z )

select datediff(ms, @t, getdate())
14 июн 13, 16:01    [14434548]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Гость333
Member

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

О, спасибо за наглядный пример! Надо бы мне повнимательнее почитать документацию по XML :-)
14 июн 13, 16:13    [14434603]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
daw
то лучше text()[1] - заметно полегче получается

Однако в предикатах, используемых внутри exists(), рекомендуют указывать именно текущий контекстный узел, т.е. точку (см., например, здесь или здесь). Надо думать, существует разница в логике извлечения значений (value()) и вычисления предикатов (exists())?
14 июн 13, 16:57    [14434866]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Однако в предикатах, используемых внутри exists(), рекомендуют указывать именно текущий контекстный узел, т.е. точку

гм. да, занятно. причем, не абы каких предикатов. но для exist(), и правда, видно такое.
14 июн 13, 17:52    [14435089]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Сон Веры Павловны
Надо думать, существует разница в логике извлечения значений (value()) и вычисления предикатов (exists())?
Ну это очевидно.
Сон Веры Павловны
Однако в предикатах, используемых внутри exists(), рекомендуют указывать именно текущий контекстный узел, т.е. точку (см., например, здесь или здесь).
Плохо воспринимаю такой текст, тыкните пальцем.
По идее текущий контекст итак задан разве 'node' и './node' не одно и тоже?
Может банально баг?
14 июн 13, 19:18    [14435329]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
HOME_X
Member

Откуда:
Сообщений: 2528
Гость333
daw,
почитать документацию по XML :-)


Ссылочку сбросьте пожалуйста, где удачнее и с примерами писано

Спасибо ....
14 июн 13, 21:02    [14435593]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Mnior,
насколько я понял, речь об этом:
Evaluating Predicates by Using the Context Node

In addition to moving predicates, ordinals, and node tests to the end of path expressions, evaluating these conditions by using the context node yields still better performance.

http://msdn.microsoft.com/en-us/library/ms345118.aspx

ну, и два примера дальше. правда, что мешает дооптимизировать первый вариант до второго, я не очень понимаю.
14 июн 13, 22:27    [14435745]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Mnior
Плохо воспринимаю такой текст, тыкните пальцем.

Mr. Wharty's Ramblings
4) Use context item in predicate to lengthen path in exist()
Bad:
SELECT * 
FROM docs 
WHERE 1 = xCol.exist('/book/subject[text() = "security"]') 

Good:
SELECT * 
FROM docs 
WHERE 1 = xCol.exist('/book/subject/text()[. = "security"]') 


(первая ссылка - там быстрее искать)
Mnior
По идее текущий контекст итак задан

Ну, он задан на каждом шаге вычисления. Статически и вне выражения его не существует.
Mnior
разве 'node' и './node' не одно и тоже?

Разумеется, нет. В случае со структурой узел/текстовый узел node() указывает на сам узел, ./node() на текстовый узел (text()[..] соответствует nodetest node()).
Mnior
Может банально баг?

Просто тот вариант, когда одно можно сделать многими способами. Для вот такого:
<root>
  <a>123</a>
</root>

результат от
/root/a[text()[1]='123']
/root/a[.='123']
/root/a[node()='123']
/root/a[./node()='123']

будет идентичен
15 июн 13, 03:24    [14436466]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Гость333
Member

Откуда:
Сообщений: 3683
HOME_X
Гость333
daw,
почитать документацию по XML :-)


Ссылочку сбросьте пожалуйста, где удачнее и с примерами писано

Спасибо ....

Я имел в виду -- полностью прочитать для начала стандартный BOL в части XPath/XQuery
15 июн 13, 05:38    [14436480]     Ответить | Цитировать Сообщить модератору
 Re: Запрос к XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Сон Веры Павловны
Mnior
разве 'node' и './node' не одно и тоже?
узел/текстовый узел node()
Я имел ввиду не функтор node(), а просто произвольный конкретно заданный. Надо было X написать (X vs ./X). Но это не меняет дела.
Сон Веры Павловны
указывает на сам узел
Указывает? Вы имеете ввиду само выражение "указывает" на что-либо? Для exist нет никакого смысла. И в этом трабла реализации - "принцип чайничка", поленились разрабы.
- Можешь представить куб в 4х мерном пространстве
- Легко, сначала представляешь в N мерном, а затем присваиваешь N 4м.
Сон Веры Павловны
./node() на текстовый узел
Не врубился.
Сон Веры Павловны
Ну, он задан на каждом шаге вычисления.
Что за императивщина в декларации?!

Просто сначала надо было это правильно понять, что вы написали:
Сон Веры Павловны
Однако в предикатах, используемых внутри exists(), рекомендуют указывать именно текущий контекстный узел, т.е. точку
Неоднозначно что да как.
Я бы сказал что-то типа: поменьше нелинейности/ветвистости фильтрующего дерева, задавать как можно глубже ... и т.п.

daw
правда, что мешает дооптимизировать первый вариант до второго
Именно!
Но вообщето скуль не XMLDB. Задачу на себя взяли непомерную. Тем более когда думающих головой разработчиков уже днём с огнём не сыскать, один спаминг индусами.
Да и XPath неполноценный/слабо мощный, в нём нет условия отношения межу элементами в разных ветках (без линков язык мёртв). А выражение с for - уродство.
15 июн 13, 18:17    [14437094]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить