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

Откуда:
Сообщений: 1066
Здравствуйте.
Все мучаюсь с оптимизацией написанных запросов и возник вопрос возможности написать код без использования курсоров, что то мне подсказывает что это возможно, но вот опыта маловато :)
Написал обобщенный скрипт, который должен обновить поле xml данными из другой таблице по ключу..
declare @x table (id int,x xml) 
insert into @x(id,x) values(3,'<val id="3_1" name="3_1" />'),(3,'<val id="3_2" name="3_2" />')
declare @r table (id int,x xml) 
insert into @r(id,x) values(1,'<val id="1" name="1" />'),(3,'<val id="3" name="3" />')
	
	--было
	select * from @r

	declare @id int,@x_id int, @f xml, @c_f xml		
	declare cr cursor local static forward_only read_only for
	select id from @r
	open cr	
	fetch next from cr  into @id		     
	while @@fetch_status = 0
	begin
		set @c_f = null
				declare cr1 cursor local static forward_only read_only for
				select x from @x where id = @id
				open cr1	
				fetch next from cr1  into @f		     
				while @@fetch_status = 0
				begin
					set @c_f = cast(isnull(cast(@c_f as varchar(max)),'') + cast(@f as varchar(max)) as xml)
					fetch next from cr1  into @f
				end
				close cr1
				deallocate cr1

			if @c_f is not null  update @r set x = cast(cast(x as varchar(max)) + cast(@c_f as varchar(max)) as xml) where id = @id
		fetch next from cr  into @id
	end
	close cr
	deallocate cr

	--стало
	select * from @r


Спасибо
19 окт 16, 15:05    [19800223]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без курсора  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
marvel,
	select 
		m.id, (select m.x, yy.adds for xml raw, type).query('//val')
	from @r [m] 
	outer apply
	(select
		(select [d].x 'adds' from @x [d] where [m].[id] = [d].[id] for xml auto, type ) adds
	) yy
19 окт 16, 16:43    [19800859]     Ответить | Цитировать Сообщить модератору
 Re: Запрос без курсора  [new]
marvel
Member

Откуда:
Сообщений: 1066
buser
marvel,
	select 
		m.id, (select m.x, yy.adds for xml raw, type).query('//val')
	from @r [m] 
	outer apply
	(select
		(select [d].x 'adds' from @x [d] where [m].[id] = [d].[id] for xml auto, type ) adds
	) yy


Спасибо!
19 окт 16, 17:25    [19801081]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить