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

Откуда: Винница, Украина
Сообщений: 190
Прошу помощи разобрать xml

declare @I_XML_CriteriasDetails xml

set @I_XML_CriteriasDetails =
'<rows>
	<row>
		<a>-1</a>
        <b>2</b>
        <c VALUE="111"/>
		<c VALUE="112"/>
	</row>
	<row>
		<a>-2</a>
        <b>2</b>
        <c VALUE="111"/>
	</row>
	<row>
		<a>-3</a>
        <b>2</b>
        <c VALUE="222"/>
		<d>
			<d_a>5</d_a>
			<d_d VALUE="1"/>
			<d_d VALUE="3"/>
		</d>
	</row>
</rows>'

SELECT 
					x.i.value('../a[1]', 'INT') as a,
					x.i.value('../b[1]', 'INT') as b,
					x.i.value('./@VALUE', 'INT') as c_values,
					x.i.value('../d[1]/d_a[1]', 'INT') as d_a,
					x.i.value('../d[1]/d_d/@VALUE', 'INT') as d_VALUES
FROM @I_XML_CriteriasDetails.nodes('/rows/row/c') as x(i)	


Желаемый результат:
a b c_VALUES d_a d_VALUES
-1 2 111 NULL NULL
-1 2 112 NULL NULL

-2 2 111 NULL NULL

-3 2 222 5 1
-3 2 222 5 3

Как видите каждая <row> нода может иметь N-e количество поднод <С> с атрибутом VALUE
Аналогично с поднодой d (она кстати может быть а может не быть в ноде row)

Мой запрос возвращает ошибку:
XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

Ошибку я понимаю, но как сделать, чтобы не указывать порядковый номер подноды d_d ?
16 май 13, 13:40    [14305283]     Ответить | Цитировать Сообщить модератору
 Re: Парсим XML в табличный вид  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
t.n.value('@VALUE', 'INT') as d_VALUES
...
...
cross apply x.i.nodes('../d[1]/d_d') as t(n)
16 май 13, 13:51    [14305340]     Ответить | Цитировать Сообщить модератору
 Re: Парсим XML в табличный вид  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
тьфу блин не cross apply но outer apply
16 май 13, 13:52    [14305344]     Ответить | Цитировать Сообщить модератору
 Re: Парсим XML в табличный вид  [new]
xandr_ukr
Member

Откуда: Винница, Украина
Сообщений: 190
Паганель
t.n.value('@VALUE', 'INT') as d_VALUES
...
...
cross apply x.i.nodes('../d[1]/d_d') as t(n)


таким образом віведет только те секции row где есть d поднода, а мне надо все
16 май 13, 13:53    [14305354]     Ответить | Цитировать Сообщить модератору
 Re: Парсим XML в табличный вид  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
xandr_ukr,
+ как-то так

select r.r.value('a[1]' ,'INT')        as a
      ,r.r.value('b[1]' ,'INT')        as b
      ,c.c.value('./@VALUE' ,'int')    as cc 
      , da.da.value('.' ,'int') as da
      ,dd.dd.value('./@VALUE' ,'int')  as dd
from   @I_XML_CriteriasDetails.nodes('/rows/row') as r(r)
outer apply r.r.nodes('./c') c(c)
outer apply r.r.nodes('./d') d(d)
outer apply d.d.nodes('./d_a') da(da)
outer apply d.d.nodes('./d_d') dd(dd)

16 май 13, 13:58    [14305383]     Ответить | Цитировать Сообщить модератору
 Re: Парсим XML в табличный вид  [new]
xandr_ukr
Member

Откуда: Винница, Украина
Сообщений: 190
Паганель,

Спасибо, земляче!!!!!
16 май 13, 13:59    [14305390]     Ответить | Цитировать Сообщить модератору
 Re: Парсим XML в табличный вид  [new]
Ennor Tiegael
Member

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

Не дофига апплаев? Все гораздо проще...
SELECT
	x.i.value('../a[1]', 'INT') as a,
	x.i.value('../b[1]', 'INT') as b,
	x.i.value('./@VALUE', 'INT') as c_values,
	x.i.value('../d[1]/d_a[1]', 'INT') as d_a,
	--x.i.value('../d[1]/d_d/@VALUE', 'INT') as d_VALUES
	y.i.value('./@VALUE', 'int') as [d_values]
FROM @I_XML_CriteriasDetails.nodes('/rows/row/c') x(i)
	outer apply x.i.nodes('./../d/d_d') y(i);
16 май 13, 14:00    [14305402]     Ответить | Цитировать Сообщить модератору
 Re: Парсим XML в табличный вид  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Ennor Tiegael,
Планы наших запросов рассудят нас.
16 май 13, 14:07    [14305471]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить