Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2016, 06:53   #1
fRosSty
 
Регистрация: 16.09.2016
Сообщений: 7
По умолчанию изменить цикл

Код:
Declare @t table(id varchar(max))
insert into @t(id)
values
('731622 11380'),
('731622 11411'),
('731622 11373'),
('731622 11388'),
('731622 11407'),
('731683 1770'),
('731683 1796'),
('731683 1859'),
('731683 1441'),
('731683 1442'),
('731683 1758'),
('7316m4 2716'),
('7316m4 2715'),
('7316m4 2714'),
('731610 34663'),
('731610 34664'),
('731610 34639'),
('731610 34778'),
('731610 34672'),
('731610 34731'),
('731676 15786'),
('731676 15790'),
('731676 15836'),
('731676 15749'),
('731676 15753'),
('731676 15763'),
('731676 15812'),
('731676 15739'),
('731676 15780'),
('731676 15781'),
('7316s1 4410'),
('7316l1 1000033166'),
('7316l1 1000033161'),
('7316l1 1000032629'),
('7316l1 1000037031'),
('7316l1 1000035648'),
('7316l1 1000038199'),
('7316l1 1000034890'),
('7316l1 1000038988'),
('7316l1 1000034280'),
('7316l1 1000032837'),
('7316l1 1000038305'),
('7316l1 1000038306'),
('7316l1 1000036177'),
('7316l1 1000029392'),
('7316l1 1000035628');
Declare @Counter Int;
set @Counter = 1;
Declare @rec uniqueidentifier;
Declare @d datetime
SET @d=GETDATE();
Declare curs Cursor FOR
	SELECT
	RecipeID
	FROM T_RECIPE
	JOIN @t a
	ON
	a.id = CONCAT(T_RECIPE.Serial ,' ', T_RECIPE.Number )
	GROUP BY
	RecipeID;
 Open Curs
		WHILE @Counter <= 600
		Begin
			FETCH curs INTO @rec;
			Set @Counter = @Counter + 1;
			exec sp_executesql N'UPDATE T_RECIPE SET Deleted = @a0,DeleteReason = @a1,DeleteUser = @a2,DeleteDateTime = @a3 WHERE  @ID = RecipeID;'
			,N'@ID uniqueidentifier,@a0 bit,@a1 varchar(24),@a2 uniqueidentifier,@a3 datetime'
			,@ID=@rec,@a0=1,@a1='Истечение срока действия',@a2='B820E301-0FA8-48C6-95C5-98316DA8A5E8',@a3=@d

			exec sp_RDS_Recipe @CancelDeleted=0,@QueueName=N'rds.registry',@Deleted=1,@IsNew=0,@ID=@rec
		END
Close curs;
как можно изменить цикл WHILE чтобы не было такого глупого условия?
так как рецептов изначальное кол-во не известно, и можно ли Update вынести за пределы курсора, будет запрос работать быстрее от этого?
mysql server 2012

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 20.09.2016 в 10:37.
fRosSty вне форума Ответить с цитированием
Старый 20.09.2016, 10:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

простите, а какую задачу решает данный цикл?
его нельзя переписать вообще без WHILE ?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.09.2016, 11:40   #3
fRosSty
 
Регистрация: 16.09.2016
Сообщений: 7
По умолчанию

из базы данных, по определенной выборке, отбраковывает рецепты (то есть в определенные графы вносит данные)
Код:
WHILE 0=0
		Begin
			FETCH next from curs INTO @rec;
			if @@fetch_status <> 0
			break
переделал цикл так
остался вопрос про апдейт, можно ли его как-то вытащить из курсора
fRosSty вне форума Ответить с цитированием
Старый 20.09.2016, 12:02   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Зачем вообще курсор? Все можно решить одним update с сответствующим условием. Кстати в update тоже можно аккуратненько from использовать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
написать процедуры для “Цикл For ... Next ” и «Цикл Do ... Loop» по ниже приведенному условию Кристина_Патачиц Microsoft Office Excel 3 17.04.2013 17:01
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34