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

Откуда:
Сообщений: 521
День добрый!
Есть таблица с полем XML, в котором может содержаться несколько блоков Line
Напимер здесь их три:
declare @XML xml=
'<Payment>
  <Line LineType="a" Quantity="1" Price="50"/>
  <Line LineType="a" Quantity="5" Price="30" />
  <Line LineType="b" Quantity="1" Price="118"/>
</Payment>'

Нужно разделить этот XML на три разные строки в таблице, чтоб в конечном итоге получилось вот так:
LineTypeQuantityPrice
a150
a530
b1118


В исходной таблице количество блоков лайнов в поле XML не постоянно и может меняться :(

Подскажите плз, как можно решить такую задачу.

Спасибо!
14 май 15, 12:54    [17639122]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз "открыть" XML  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
declare @XML xml=
'<Payment>
  <Line LineType="a" Quantity="1" Price="50"/>
  <Line LineType="a" Quantity="5" Price="30" />
  <Line LineType="b" Quantity="1" Price="118"/>
</Payment>'

SELECT
	  LineType = t.c.value('@LineType', 'CHAR(1)')
	, Quantity = t.c.value('@Quantity', 'INT')
	, Price = t.c.value('@Price', 'INT')
FROM @XML.nodes('*/*') t(c)
14 май 15, 13:01    [17639180]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз "открыть" XML  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
AlanDenton,
Надёжней узлы выдергивать с конкретным именем - вдруг измениться иераррхия

declare @XML xml=
'<Payment>
  <Line LineType="a" Quantity="1" Price="50"/>
  <Line LineType="a" Quantity="5" Price="30" />
  <Line LineType="b" Quantity="1" Price="118"/>
</Payment>'

SELECT
	  LineType = t.c.value('@LineType', 'CHAR(1)')
	, Quantity = t.c.value('@Quantity', 'INT')
	, Price = t.c.value('@Price', 'INT')
FROM @XML.nodes('//Line') t(c)
14 май 15, 13:08    [17639230]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз "открыть" XML  [new]
abrashka
Member

Откуда:
Сообщений: 521
Спасибо большое, с XML-ем разобрался.
На самом деле задача сложнее, есть таблица:
Create table #MyTable (Id int, Data_XML XML)
insert into #MyTable
Values (10,
'<Payment>
  <Line LineType="a" Quantity="1" Price="50"/>
  <Line LineType="a" Quantity="5" Price="30" />
  <Line LineType="b" Quantity="1" Price="118"/>
</Payment>'),
(20,
'<Payment>
  <Line TLineTypeype="b" Quantity="2" Price="10"/>
</Payment>'),
 (30,
'<Payment>
  <Line LineType="a" Quantity="1" Price="20"/>
  <Line LineType="b" Quantity="1" Price="15"/>
</Payment>')


Нужен Select, который выдаст результат типа:
IdLineTypeQuantityPrice
10a150
10a530
10b1118
20b210
30a120
30b115

Можно как-то одним селектом написать или создать функцию, которая принимает XML и обрабатывает его согласно примеру выше и запускать эту функцию для каждого Id(для каждой строки) в таблице #MyTable?
14 май 15, 13:52    [17639516]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз "открыть" XML  [new]
Glory
Member

Откуда:
Сообщений: 104751
abrashka
Можно как-то одним селектом написать

Можно. В хелпе даже есть пример
14 май 15, 13:56    [17639535]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз "открыть" XML  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4846
abrashka,

Create table #MyTable (Id int, Data_XML XML)
insert into #MyTable
Values (10,
'<Payment>
  <Line LineType="a" Quantity="1" Price="50"/>
  <Line LineType="a" Quantity="5" Price="30" />
  <Line LineType="b" Quantity="1" Price="118"/>
</Payment>'),
(20,
'<Payment>
  <Line TLineTypeype="b" Quantity="2" Price="10"/>
</Payment>'),
 (30,
'<Payment>
  <Line LineType="a" Quantity="1" Price="20"/>
  <Line LineType="b" Quantity="1" Price="15"/>
</Payment>')
;

SELECT
	  LineType = t.c.value('@LineType', 'CHAR(1)')
	, Quantity = t.c.value('@Quantity', 'INT')
	, Price = t.c.value('@Price', 'INT')
FROM #MyTable A OUTER APPLY A.Data_XML.nodes('*/*') t(c)

GO 

DROP TABLE #MyTable
14 май 15, 13:59    [17639547]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз "открыть" XML  [new]
abrashka
Member

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

Большое спасибо!
Написал так:
select Id,	  
		LineType = t.c.value('@LineType', 'CHAR(1)')
	, Quantity = t.c.value('@Quantity', 'INT')
	, Price = t.c.value('@Price', 'INT')
FROM 
 #MyTable mt
	CROSS APPLY mt.Data_XML.nodes('//Line') t(c)


Раз мы уже говорим об XML, сорри за идиотский вопрос, почему иногда пишут типа
<LineType>a</LineType>
а иногда LineType='a' ?
В интернете полно примеров, но каждый раз что-то дугое.. есть разница в записи?
14 май 15, 14:05    [17639585]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз "открыть" XML  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
abrashka
a_voronin,

Большое спасибо!
Написал так:
select Id,	  
		LineType = t.c.value('@LineType', 'CHAR(1)')
	, Quantity = t.c.value('@Quantity', 'INT')
	, Price = t.c.value('@Price', 'INT')
FROM 
 #MyTable mt
	CROSS APPLY mt.Data_XML.nodes('//Line') t(c)


Раз мы уже говорим об XML, сорри за идиотский вопрос, почему иногда пишут типа
<LineType>a</LineType>
а иногда LineType='a' ?
В интернете полно примеров, но каждый раз что-то дугое.. есть разница в записи?


Это не разница в записи - это разные структуры документа.Чтобы не задавать "идиотских вопросов" почитаете про элементы и атрибуты
14 май 15, 14:25    [17639727]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз "открыть" XML  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
Есть много простых статей описывающих на пальцах структуру XML-документа

XML за 20 минут
14 май 15, 14:30    [17639781]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить