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

declare @X varchar(max)
declare @xml_id int

set @X =
'<ROOT>
<ROW A = "1" B = "3" />
<ROW A = "2" B = "2" />
<ROW A = "3" B = "1" />
</ROOT>'

exec sp_xml_preparedocument @xml_id out, @X

select
*
from
openxml (@xml_id, 'ROOT/ROW',1)
with (A int, B int)
   
exec sp_xml_removedocument @xml_id



А есть ли возможность как-нибудь вытащить те же данные из такого формата:

<ROOT>
<ROW><A>1</A><B>3</B></ROW>
<ROW><A>2</A><B>2</B></ROW>
<ROW><A>3</A><B>1</B></ROW>
</ROOT>
26 июн 15, 11:17    [17819151]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2008 и XML  [new]
Gviber
Member

Откуда:
Сообщений: 124
openxml (@xml_id, 'ROOT/ROW',11)

нужно 11 поставить вместо 1.

ИМХО FROM OPENXML устарело. Лучше переписать на nodes.
26 июн 15, 11:38    [17819299]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2008 и XML  [new]
Gviber
Member

Откуда:
Сообщений: 124
declare @x xml = '<ROOT>
<ROW><A>1</A><B>3</B></ROW>
<ROW><A>2</A><B>2</B></ROW>
<ROW><A>3</A><B>1</B></ROW>
</ROOT>'

select a.b.value('A[1]', 'INT'),
       a.b.value('B[1]', 'INT')
from @x.nodes('/ROOT/ROW') a(b)
26 июн 15, 11:58    [17819460]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2008 и XML  [new]
Miau
Guest
Gviber,

Спасибо. Буду теперь знать.
С nodes, действительно, симпатичнее.
26 июн 15, 12:11    [17819567]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2008 и XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
select
*
from
openxml (@xml_id, 'ROOT/ROW',2)
with (A int, B int)
26 июн 15, 12:31    [17819664]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL 2008 и XML  [new]
Miau
Guest
Вот такой код выполняется 1 минуту:

declare @T table
 (repair_times_id varchar(10),
 group_sequence varchar(10),
 group_description nvarchar(100),
 sub_group_sequence varchar(10),
 sub_group_description nvarchar(100),
 repair_id varchar(10),
 component_sequence varchar(10),
 component_description nvarchar(100),
 [action] varchar(10),
 action_description nvarchar(100),
 time_hrs money,
 time_mins money)     

insert
 @T
select
 a1.x.value('repair_times_id[1]', 'varchar(10)') repair_times_id,
 a2.x.value('group_sequence[1]', 'varchar(10)') group_sequence,
 a2.x.value('group_description[1]', 'nvarchar(100)') group_description,
 a3.x.value('sub_group_sequence[1]', 'varchar(10)') sub_group_sequence, 
 a3.x.value('sub_group_description[1]', 'nvarchar(100)') sub_group_description,
 a4.x.value('repair_id[1]', 'varchar(10)') repair_id,
 a4.x.value('component_sequence[1]', 'varchar(10)') component_sequence,
 a4.x.value('component_description[1]', 'nvarchar(100)') component_description,
 a4.x.value('action[1]', 'varchar(10)') [action],
 a4.x.value('action_description[1]', 'nvarchar(100)') action_description,
 a4.x.value('time_hrs[1]', 'money') time_hrs,
 a4.x.value('time_mins[1]', 'money') time_mins    
from
 @XML.nodes('/response/data') a1(x)
 CROSS APPLY a1.x.nodes('repair_times/repair_time') a2(x)
 CROSS APPLY a2.x.nodes('sub_group/item') a3(x)
 CROSS APPLY a3.x.nodes('components/component') a4(x)


если закомментировать
 insert
 @T

Выполнится за 4 секунды.

Откуда что берётся? И как с этим бороться?
29 июн 15, 15:45    [17828812]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить