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

Откуда: Прага
Сообщений: 247
Добрый день!

Всю голову себе сломал, может нужно идти другим путем: есть xml типа

<period id="1" datefrom="20010101" dateto="20010201">
	<price id="1" val="1" />
	<price id="2" val="2" />
</period>

<period id="1" datefrom="20010202" dateto="20010401">
	<price id="3" val="3" />
	<price id="4" val="4" />
</period>

<period id="1" datefrom="20010101" dateto="20010201">
	<price id="5" val="5" />
	<price id="6" val="6" />
</period>


Нужно вставить узлы period в одну таблицу, а потом узлы price в другую, при этом нужно как-то эти узлы идентифицировать.

Фишка в том, что атрибуты узлов period могут быть неуникальными. Для этого я хотел проапдейтить значение id у каждого узла например на newid(), но не уверен, что это возможно, т.к. не нашел в инете примеров применения функции newid() при апдейте узла xml.

Может эту задачу можно решить каким-то другим путем? Спасибо.
14 янв 14, 21:53    [15415618]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить уникальное значение узлу в XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
declare @x xml = '<period id="1" datefrom="20010101" dateto="20010201">
	<price id="1" val="1" />
	<price id="2" val="2" />
</period>

<period id="1" datefrom="20010202" dateto="20010401">
	<price id="3" val="3" />
	<price id="4" val="4" />
</period>

<period id="1" datefrom="20010101" dateto="20010201">
	<price id="5" val="5" />
	<price id="6" val="6" />
</period>';

if object_id('tempdb..#t', 'U') is not null
 drop table #t;

select
 identity(int, 1, 1) as id,
 n.value('@id[1]', 'int') as period_id,
 n.value('@datefrom[1]', 'datetime') as datefrom,
 n.value('@dateto[1]', 'datetime') as dateto,
 n.query('price') as price_xml
into
 #t
from
 @x.nodes('period') t(n);

select
 id, period_id, datefrom, dateto
from
 #t;

select
 t.id,
 p.n.value('@id[1]', 'int') as price_id,
 p.n.value('@val[1]', 'int') as price_val
from
 #t t cross apply
 price_xml.nodes('price') p(n);
14 янв 14, 22:44    [15415780]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить уникальное значение узлу в XML  [new]
Hooly-Gun
Member

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


DECLARE @xml      XML =
        '<root>
	<period id="1" datefrom="20010101" dateto="20010201">
		<price id="1" val="1"/>
		<price id="2" val="2"/>
	</period>
	<period id="1" datefrom="20010202" dateto="20010401">
		<price id="3" val="3"/>
		<price id="4" val="4"/>
	</period>
	<period id="1" datefrom="20010101" dateto="20010201">
		<price id="5" val="5"/>
		<price id="6" val="6"/>
	</period>
	<period id="1" datefrom="20010301" dateto="20010301">
		<price id="5" val="7"/>
		<price id="6" val="8"/>
	</period>
</root>'

DECLARE @handler  INT

EXEC sp_xml_preparedocument @handler OUTPUT,
     @xml

SELECT CHECKSUM(t.datefrom, t.dateto, t.id) id,
       t.datefrom,
       t.dateto,
       t.idChild,
       t.val
FROM   OPENXML(@handler, '/root/period/price', 1) 
       WITH (
           id INT '../@id',
           datefrom date '../@datefrom',
           dateto date '../@dateto',
           idChild INT '@id',
           val INT '@val'
       ) t

EXEC sp_xml_removedocument @handler
14 янв 14, 23:28    [15415888]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить уникальное значение узлу в XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Ну почему почти никто никогда не озвучивает XmlBulkLoad ? invm

Замапал названия таблиц и сразу хоп, волшебным образом залилось сразу во все таблы, притом наибыстрым способом любые размеры файлов/потоков.
15 янв 14, 04:27    [15416352]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить уникальное значение узлу в XML  [new]
Сон Веры Павловны
Member

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

помести уже наконец описание XmlBulkLoad в FAQ, с более-менее подробным описанием и примером. Думаю, вспоминать будут чаще - всё же (я надеюсь) в FAQ заглядывают чаще, чем в поиск.
15 янв 14, 05:58    [15416391]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить уникальное значение узлу в XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
<Краснея>
Так и думал, что скажут.
Мне туда непривычно ставить, и пока лень, типа не делал ни разу значит сложно, а главное ответственно, это же FAQ!!! :)
Ссори.
15 янв 14, 10:48    [15417134]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить уникальное значение узлу в XML  [new]
cavalero
Member

Откуда: Прага
Сообщений: 247
invm, спасибо! сделал по вашему примеру.
Mnior, спасибо! XmlBulkLoad - наше всё для будующих парсингов.
15 янв 14, 13:17    [15418168]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить