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

Откуда:
Сообщений: 30
+
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
20 сен 16, 08:18    [19685860]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
IDVT
Member

Откуда:
Сообщений: 320
Зачем вообще тут курсор и цикл? обновить данные целевой таблицы из выборки...
20 сен 16, 09:30    [19685991]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
fRosSty,

судя по всему в запросе все познания по tsql сразу :) чем вас простой UPDATE не устраивает?
20 сен 16, 09:46    [19686038]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
rsolanov
Member

Откуда:
Сообщений: 930
Перепишите свою ХП sp_RDS_Recipe так, чтобы во входной параметр @ID можно было передавать набор данных, тогда можно будет сначала написать один UPDATE и затем ХП и обойтись без использования курсоров.
20 сен 16, 10:01    [19686087]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
fRosSty
Member

Откуда:
Сообщений: 30
в базе 490000 строк, из них нужно апдейтить 600 по определенной выборке, которая тут указанна не полностью (чтобы не захламлять пост). выбрав 600 этих рецептов я их загоняю в курсор, чтобы построчно апдейтить. делал с условием "While @@FETCH_STATUS=0", так не работает, ничего лучше как контейнер, в голову не пришло, но это не рационально, так как кол-во строк для апдейта может быть и не известно в начале
20 сен 16, 10:32    [19686202]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
fRosSty
в базе 490000 строк, из них нужно апдейтить 600 по определенной выборке, которая тут указанна не полностью (чтобы не захламлять пост). выбрав 600 этих рецептов я их загоняю в курсор, чтобы построчно апдейтить. делал с условием "While @@FETCH_STATUS=0", так не работает, ничего лучше как контейнер, в голову не пришло, но это не рационально, так как кол-во строк для апдейта может быть и не известно в начале

с какой целью вы так делаете? поиздеваться над сервером? сократить количество блокировок? оптимизировать затраты?
20 сен 16, 10:34    [19686214]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
fRosSty
Member

Откуда:
Сообщений: 30
TaPaK,
отбраковать рецепты, по истечению их срока действия
20 сен 16, 10:36    [19686230]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
fRosSty
TaPaK,
отбраковать рецепты, по истечению их срока действия

не цель, а метод. чем вас простой update не устраивает?
20 сен 16, 10:37    [19686241]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
dymka
Member

Откуда: г. Альметьевск (Татарстан)
Сообщений: 235
    
open cur
while 0=0
begin
  fetch next from cur into @vars
  if @@fetch_status <> 0
    break

   exec ...
end


Ну а лучше прислушаться к вышесказанным советам.
20 сен 16, 10:41    [19686272]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
fRosSty
Member

Откуда:
Сообщений: 30
TaPaK,
мне кажется не получится без курсора, как я буду построчно RecipeID заносить в Update и в хранимку?
20 сен 16, 10:42    [19686280]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
fRosSty
TaPaK,
мне кажется не получится без курсора, как я буду построчно RecipeID заносить в Update и в хранимку?

а текст этой чудо процедуры можно? кроме всего есть OUTPUT, есть триггеры да вообще всё что угодно кроме богомерзких циклов/курсоров
20 сен 16, 10:44    [19686291]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
fRosSty
Member

Откуда:
Сообщений: 30
TaPaK,
я понимаю что функционал велик, просто я не так давно изучаю SQL. как бы что не понимаю, не все получается в нетике найти, вот и поэтому спрашиваю у более опытных
dymka,
спасибо, с цикл работает
20 сен 16, 10:50    [19686311]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
IDVT
Member

Откуда:
Сообщений: 320
fRosSty
в базе 490000 строк, из них нужно апдейтить 600 по определенной выборке, которая тут указанна не полностью (чтобы не захламлять пост). выбрав 600 этих рецептов я их загоняю в курсор, чтобы построчно апдейтить. делал с условием "While @@FETCH_STATUS=0", так не работает, ничего лучше как контейнер, в голову не пришло, но это не рационально, так как кол-во строк для апдейта может быть и не известно в начале


Раз вы можете определить что Вам обновлять (конкретные строки и или их количество) и новое значение, то вполне можно обойтись простым Update. Но почему то Вы упорно и целенаправленно шагаете в сторону граблей (курсора), когда станет вопрос оптимизации всей бизнес логики, Вы все равно вернетесь к этому вопросу....
20 сен 16, 12:32    [19686980]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
IDVT
Member

Откуда:
Сообщений: 320
Update Рецепты
       Set  R.Поле_таблицы_рецепты_1 = Up.Поле_нового_значения_1
          , R.Поле_таблицы_рецепты_2 = Up.Поле_нового_значения_2
          , R.Поле_таблицы_рецепты_N = Up.Поле_нового_значения_N
From Рецепты as R inner join ( Select  Идентификатор
                                     , Поле_нового_значения_1
                                     , Поле_нового_значения_2
                                     , Поле_нового_значения_N
                               from ТаблицаХЗ )Up
				              on R.Идентификатор = Up.Идентификатор
Where R.Идентификатор IN ( select Идентификатор
                           From Мои_600_Рецептов )



Зачем тут курсор, циклы и ХП?
20 сен 16, 12:44    [19687031]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
IDVT
Update Рецепты
       Set  R.Поле_таблицы_рецепты_1 = Up.Поле_нового_значения_1
          , R.Поле_таблицы_рецепты_2 = Up.Поле_нового_значения_2
          , R.Поле_таблицы_рецепты_N = Up.Поле_нового_значения_N
From Рецепты as R inner join ( Select  Идентификатор
                                     , Поле_нового_значения_1
                                     , Поле_нового_значения_2
                                     , Поле_нового_значения_N
                               from ТаблицаХЗ )Up
				              on R.Идентификатор = Up.Идентификатор
Where R.Идентификатор IN ( select Идентификатор
                           From Мои_600_Рецептов )



Зачем тут курсор, циклы и ХП?

где таки пируэтам обучают?
20 сен 16, 12:47    [19687039]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
fRosSty
Member

Откуда:
Сообщений: 30
TaPaK,
что в запросе IDVT?
сейчас попробую потестить его
ок, ребята вообщем как я понимаю, от курсора в моем случае лучше отказаться и просто использовать Update?
20 сен 16, 12:54    [19687072]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
IDVT
Member

Откуда:
Сообщений: 320
Where R.Идентификатор IN ( select Идентификатор
                           From Мои_600_Рецептов )
это лишнее, TaPaK правильно заметил
20 сен 16, 13:01    [19687099]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
IDVT
Where R.Идентификатор IN ( select Идентификатор
                           From Мои_600_Рецептов )
это лишнее, TaPaK правильно заметил

автор
( Select Идентификатор
, Поле_нового_значения_1
, Поле_нового_значения_2
, Поле_нового_значения_N
from ТаблицаХЗ )Up
on R.Идентификатор = Up.Идентификатор

а эта красота к чему, цель?
20 сен 16, 13:05    [19687112]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
fRosSty
Member

Откуда:
Сообщений: 30
IDVT,
у меня вопрос, мне получается таблицу Рецепты надо сджойнить с @t table?
20 сен 16, 13:08    [19687121]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
IDVT
Member

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

данных о количестве таблиц, полей в тестовом примере нет (тем более он упрощен), листинг dbo.sp_RDS_Recipe отсутствует....
20 сен 16, 13:09    [19687125]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
IDVT
Member

Откуда:
Сообщений: 320
fRosSty
IDVT,
у меня вопрос, мне получается таблицу Рецепты надо сджойнить с @t table?

Во временной таблице тоже есть потребность?
20 сен 16, 13:11    [19687130]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
IDVT
Member

Откуда:
Сообщений: 320
IDVT
fRosSty
IDVT,
у меня вопрос, мне получается таблицу Рецепты надо сджойнить с @t table?

Во временной таблице тоже есть потребность?
поспешил, в рамках вашего примера, то да, по факту будет запрос.
20 сен 16, 13:12    [19687139]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
fRosSty
Member

Откуда:
Сообщений: 30
IDVT,
ну она только хранит в себе Серию и Номер рецепта, по которым я и определяю нужные мне
20 сен 16, 13:13    [19687144]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
IDVT
Member

Откуда:
Сообщений: 320
fRosSty
IDVT,
ну она только хранит в себе Серию и Номер рецепта, по которым я и определяю нужные мне

Дело не в том сколько полей, длина, и кол. строк, дело то в привычке, которую лучше сразу подсекать.
20 сен 16, 14:00    [19687414]     Ответить | Цитировать Сообщить модератору
 Re: Изменить цикл  [new]
fRosSty
Member

Откуда:
Сообщений: 30
TaPaK,
после хорошего сна, осознал что Update в курсоре не нужен и все проверил на практике
Всем спасибо все работает)
21 сен 16, 08:40    [19690129]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить