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

Подскажите как должен выглядеть запрос к xml-ю, если нужно следующее:
Отбираю некий набор данных типа:
select ...
from @xml.nodes('/r1/r2/r3/r4/r5/..../record') n(s)

Этих данных много и они имеют некие атрибуты, которые я могу получить в селекте типа:
s.value('(@attribute)[1]', 'varchar(50)')	

и тут проблем нет, проблемы появляются, когда мне нужно получить атрибут у предшествующей ноды и предпредшествующей и т.д. Так нужно подниматься до N нод вверх. Как должен выглядеть запрос? Хочется получить что-то типа:
s.value('(././././././././@attribute)[1]', 'varchar(50)')	
7 сен 12, 13:46    [13129681]     Ответить | Цитировать Сообщить модератору
 Re: xml-ый зарос с получением значения из родителя, прородителя и т.п.  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
Сталкивался с этим не так давно. Решение №1 "в лоб" - которое ты описал - работало медленно. Решение №2 см далее.
r1, r2, r3 и т.д. - это некие сущности, атрибуты которых тебе нужно получить. Поэтому последовательно парсятся узлы разных уровней, от верхнего к вложенным. Если иерархия узлов стабильная (r1-r2-r3...),то выглядит примерно так:
1)
select
r.value(... r1_атрибут1) as [атрибут1], -- поля атрибутов
r.value(... r1_атрибут2) as [атрибут2],
...
r.query(... путь_к_r2) as [r2_xml] -- поле типа xml
from @xml_var (путь_к_r1) t(r)
into #table_r1

2) select
r.value(... r2_атрибут1) as [атрибут1], -- поля атрибутов
r.value(... r2_атрибут2) as [атрибут2],
...
r.query(... путь_к_r3) as [r3_xml] -- поле типа xml
from #table_r2.r2_xml (путь_к_r2) t(r)

и т.д.

Если иерархия достаточно свободная, и узлы record могут быть на любом уровне, то можно через CTE.
7 сен 12, 15:53    [13130951]     Ответить | Цитировать Сообщить модератору
 Re: xml-ый зарос с получением значения из родителя, прородителя и т.п.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
thrashead
1)
select
r.value(... r1_атрибут1) as [атрибут1], -- поля атрибутов
r.value(... r1_атрибут2) as [атрибут2],
...
r.query(... путь_к_r2) as [r2_xml] -- поле типа xml
from @xml_var (путь_к_r1) t(r)
into #table_r1

2)
select
r.value(... r2_атрибут1) as [атрибут1], -- поля атрибутов
r.value(... r2_атрибут2) as [атрибут2],
...
r.query(... путь_к_r3) as [r3_xml] -- поле типа xml
from #table_r2.r2_xml (путь_к_r2) t(r)


Всё очень просто:
SELECT	 R1.X.value('@Attribute','SqlType')
	,R2.X.value('@Attribute','SqlType')
	...
	,RN.X.value('@Attribute','SqlType')
FROM	            @xml.nodes('/Path1') R1(X)
	CROSS APPLY R1.X.nodes( 'Path2') R2(X)
	CROSS APPLY R1.X.nodes( 'Path2') R2(X)
	...
	CROSS APPLY RM.X.nodes( 'PathN') RN(X)

xml query
s.value('(@attribute)[1]'
Это жесть. Вы хоть понимаете смысл?, что атрибутов не может быть более одного.
7 сен 12, 17:11    [13131637]     Ответить | Цитировать Сообщить модератору
 Re: xml-ый зарос с получением значения из родителя, прородителя и т.п.  [new]
xml query
Guest
Mnior,

огромное спасибо! Именно вариант с "cross apply" работает действительно хорошо! Ну, по крайней мере, на моих небольших объемах (несколько мегобайт).
10 сен 12, 09:04    [13138007]     Ответить | Цитировать Сообщить модератору
 Re: xml-ый зарос с получением значения из родителя, прородителя и т.п.  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Главное не забывайте о XmlBulkLoad
10 сен 12, 09:19    [13138039]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить