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

Откуда:
Сообщений: 82
Сервер Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Есть файл.

<?xml version="1.0" encoding="windows-1251" ?>
<users>
	<user>
		<rsid>00272</rsid>
		<inn>77040</inn>
		<pays>
			<pay>
				<payid>221</payid>
				<inout>out</inout>
			</pay>
			<pay>
				<payid>222</payid>
				<inout>out</inout>
			</pay>
		</pays>
		<scheta>
			<schet>	
				<ostatok>10000.0000</ostatok>
			</schet>
			<schet>
				<ostatok>50000.0000</ostatok>
			</schet>
		</scheta>
	</user>
	<user>
		<rsid>00278</rsid>
		<inn>77044</inn>
		<pays>
			<pay>
				<payid>227</payid>
				<inout>in</inout>
			</pay>
			<pay>
				<payid>228</payid>
				<inout>in</inout>
			</pay>
			<pay>
				<payid>229</payid>
				<inout>in</inout>
			</pay>
		</pays>
		<scheta>
			<schet>	
				<ostatok>1000.0000</ostatok>
			</schet>
			<schet>
				<ostatok>5000.0000</ostatok>
			</schet>
		</scheta>
	</user>
</users>


Нужно получить :
rsid payid ostatok
00272 221 10000
00272 222 10000
00272 221 50000
00272 222 50000

00274 227 1000
00274 228 1000
00274 229 1000
00274 227 5000
00274 228 5000
00274 229 5000

Делаю :
declare @query nvarchar(max), @xml xml
declare @l_node varchar(4000)

set @l_node = 'rsid'
set @query = N'SET @out = 
(SELECT * FROM OPENROWSET(bulk ''c:\Copy of 2012-10-09_rsbank_with_data.xml'', SINGLE_BLOB) as fd)';

EXEC sp_executesql @query, N'@out xml out', @out = @xml out;

select
  c.value('rsid[1]', 'varchar(50)') ,
 d.value('payid[1]', 'varchar(50)')
from @xml.nodes('users/user') as a(c)
 outer apply @xml.nodes('users/user/pays/pay') as b(d)

Получаю:
rsid payid
00272 221
00272 222
00272 227
00272 228
00272 229

00274 221
00274 222
00274 227
00274 228
00274 229

Возможно ли без курсора распарсить файл как я показал в пункте "Нужно получить :" ? Был бы признателен за подсказку как это сделать
10 окт 12, 14:14    [13296030]     Ответить | Цитировать Сообщить модератору
 Re: Бьюсь над XML. Помогите, плиз.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
smallserg
Был бы признателен за подсказку как это сделать
Непонятно, как соотносятся тестове данные и желаемый (и получаемый вами) результат.

У вас в данные есть 2 rsid: 00272 и 00278, а в результате 00272 и 00274
Как соотносятся pay и ostatok, тоже непонятно. Перемножение всех сочетаний?

Наверное так можно:
select
	p.value('../../rsid[1]', 'varchar(50)') ,
	p.value('payid[1]', 'varchar(50)'),
	o.value('ostatok[1]', 'varchar(50)')
from @xml.nodes('users/user/pays/pay') as p(p)
	outer apply @xml.nodes('users/user/scheta/schet') as o(o)
where o.value('../../rsid[1]', 'varchar(50)') = p.value('../../rsid[1]', 'varchar(50)')
order by 1,3,2
10 окт 12, 15:13    [13296544]     Ответить | Цитировать Сообщить модератору
 Re: Бьюсь над XML. Помогите, плиз.  [new]
antbr
Member

Откуда:
Сообщений: 75
smallserg,
select b.value('rsid[1]','varchar(50)'),
		d.value('payid[1]','varchar(50)'),
		f.value('ostatok[1]','varchar(50)')
from @xml.nodes('users/user') a(b)
	outer apply a.b.nodes('pays/pay') c(d)
	outer apply a.b.nodes('scheta/schet') e(f)


Вроде то что требовалось получилось
10 окт 12, 15:22    [13296642]     Ответить | Цитировать Сообщить модератору
 Re: Бьюсь над XML. Помогите, плиз.  [new]
smallserg
Member

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

Вот блин.... Все-таки затесалась ошибка (правил в текстовом файле - конечно же, в результате должно быть rsid 00278). Про pay и ostatok Вы поняли верно - перемножение, но в рамках одного rsid. Ваш вариант запроса дает необходимый мне результат, спасибо. Но нуна в ём покопаться :).
10 окт 12, 15:26    [13296695]     Ответить | Цитировать Сообщить модератору
 Re: Бьюсь над XML. Помогите, плиз.  [new]
smallserg
Member

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

Благодаря Вашему примеру я понял как оно работает. Спасибо.
10 окт 12, 15:30    [13296743]     Ответить | Цитировать Сообщить модератору
 Re: Бьюсь над XML. Помогите, плиз.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
antbr
Вроде то что требовалось получилось
Не, это перемнождение всего со всем, а ТС похоже нужно перемножить только payid с ostatok
10 окт 12, 16:00    [13297064]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить