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

Откуда:
Сообщений: 442
Есть XML и есть sql server 2000.
XML имеет формат что-то вроде:

<заказ>
<номерзаказа>1</номерзаказа>
<накладные>
<накладная>100</накладная>
<накладная>101</накладная>
</накладные>
</заказ>

<заказ>
<номерзаказа>2</номерзаказа>
<накладные>
</накладные>
</заказ>


Можноли получить слудующий результат:

номерзаказа накладная
1 100
1 101
2 NULL

Сейчас делаю 2 , получаю заказы, получаю накладные, и клею их через LEFT JOIN по номеру заказа. А можно как-нить это поаккуратней сделать?
1 июн 09, 17:54    [7252915]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
caper
Member

Откуда: Москва
Сообщений: 418
обратиться к элементу верхнего уровня можно с помощью конструкции ../ . например
tab.col.value('../../../@Label', 'nvarchar(100)') as ParentDimensionLabel
1 июн 09, 18:19    [7253039]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
BERSERC
Member

Откуда:
Сообщений: 442
ну так у меня нет всех элементов нижнего уровня, тогда просто часть строк пропадает
1 июн 09, 18:27    [7253075]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

не уверен, что это "поаккуратней", чем способ используемый вами сейчас, но
можно как-то так извернуться:
select *
from openxml(@hdoc, N'/root/заказ//*[(local-name()="накладные" and not(./накладная)) or (local-name()="накладная")]')
with ([номерзаказа] int N'..//../номерзаказа'
       , [накладная] int '.[local-name()="накладная"]/text()'
      )


Posted via ActualForum NNTP Server 1.4

2 июн 09, 08:55    [7254147]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Супер! Спасибо!!!
вот только не могу нигде найти что означают квадрантые скобки и /text() =(
2 июн 09, 10:38    [7254545]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> вот только не могу нигде найти что означают квадрантые скобки и /text() =(

в квадратных скобках указывается условие отбора узла.
text() возвращает текстовый узел (первый).
если обращаться просто к текущему узлу: ".", то,
в случае, если он пуст (<накладные></накладные>) будет
возвращен 0 (узел есть, но значение пустое - при преобразовании
к int это интерпретируется как 0).
если же обращаться к текстовому узлу внутри текущего
узла: "./text()" возвращается NULL (поскольку его - текстового
узла - нет).

Posted via ActualForum NNTP Server 1.4

2 июн 09, 10:49    [7254622]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
BERSERC
Member

Откуда:
Сообщений: 442
Спасибо!!!! =)
2 июн 09, 11:01    [7254671]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

собственно, в данном случае можно и без text() обойтись:

, [накладная] int '.[local-name()="накладная"]'

NULL и так получим - за счет условия отбора.

просто я, пока пробовал, сначала без условия написал
, [накладная] int '.'
вот и пришлось, чтобы NULL получить, к текстовому
узлу внутри <накладные></накладные> обращаться.

Posted via ActualForum NNTP Server 1.4

2 июн 09, 11:04    [7254697]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
BERSERC
Member

Откуда:
Сообщений: 442
прикольно, а откуда ты черпал информацию по этим "условиям", в спарвке SQL в статье OPENXML ни слова про то, что можно какие-то условия в путях писать )
2 июн 09, 11:20    [7254822]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из XML с разной глубиносй структуры  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> прикольно, а откуда ты черпал информацию по этим "условиям", в спарвке
> SQL в статье OPENXML ни слова про то, что можно какие-то условия в путях
> писать )

ну, собственно, там сказано, что это rowpattern-ы - это выражения xpath.
дальше уже можно почитать в справке, или еще где (родной для таких вещей
http://www.w3.org/), собственно про xpath.

более конкретно что-то, популярно про это рассказывающее, посоветовать
не могу, увы :(

Posted via ActualForum NNTP Server 1.4

2 июн 09, 11:49    [7255009]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить