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

Откуда:
Сообщений: 67
Исходные данные:
1. Есть процедура с набором входных параметров.
2. Есть таблица (переменная типа table) в которой хранятся наборы значений.

Что нужно:
Необходимо организовать цикл в котором выполнить хранимую процедуру, на вход которой подавать значения хранящиеся в таблице.

В общем что-то вроде этого:

select @c = count(*) 
,      @i = 1
from @mytable
While @i <= @c begin
     exec myproc @a = select a from @mytable where id = @i
          ,      @b = select b from @mytable where id = @i
     set @i = @i + 1
end -- of while

Данная конструкция не работает, а заводить кучу переменных для заблаговременного помещения в них данных чтобы потом подать их на вход процедуры примерно так:
select @c = count(*) 
,      @i = 1
from @mytable
declare @aa 
declare @bb
While @i <= @c begin
     select @aa = a from @mytable where id = @i
     select @bb = b from @mytable where id = @i
     exec myproc @a = @aa, @b = @bb
     set @i = @i + 1
end -- of while
не хочется, т.к. параметров получается много, и в разных таблицах их может быть разное количество.

Можно этого избежать?
2 ноя 05, 16:21    [2032095]     Ответить | Цитировать Сообщить модератору
 Re: в цикле выполнить процедуру, на вход которой подать данные из запроса  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select @c = count(*) 
,      @i = 1
from @mytable
declare @aa 
declare @bb
While @i <= @c begin
     select @aa = a, @bb = b from @mytable where id = @i
     exec myproc @a = @aa, @b = @bb
     set @i = @i + 1
end -- of while

для спящего время бодрствования равносильно сну
2 ноя 05, 16:24    [2032127]     Ответить | Цитировать Сообщить модератору
 Re: в цикле выполнить процедуру, на вход которой подать данные из запроса  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

обычно такие фокусы через курсоры делаются... если, конечно нельзя
переписать процедуру на функцию, или же перестроить ее логику так, чтоб она
умела работать с наборами данных


Posted via ActualForum NNTP Server 1.3

2 ноя 05, 16:26    [2032149]     Ответить | Цитировать Сообщить модератору
 Re: в цикле выполнить процедуру, на вход которой подать данные из запроса  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
бывает что такая организация выборки по кластерному ключу превосходит по времени чем если использовать курсор

для спящего время бодрствования равносильно сну
2 ноя 05, 16:28    [2032164]     Ответить | Цитировать Сообщить модератору
 Re: в цикле выполнить процедуру, на вход которой подать данные из запроса  [new]
MOXHATOE
Member

Откуда:
Сообщений: 67
Алексей2003, ваш вариант полностью повторяет мой (вы только два селекта в один переписали).
Но я то хотел другого: избавиться от доп.переменных @aa, @bb и так далее, котоих может быть до 20 штук.

daw, к сожалению с набором данных процедура работать не может, а курсоры усложнят код гораздо больше чем добавка доп.переменных...
2 ноя 05, 16:33    [2032197]     Ответить | Цитировать Сообщить модератору
 Re: в цикле выполнить процедуру, на вход которой подать данные из запроса  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
нельзя.

для спящего время бодрствования равносильно сну
2 ноя 05, 16:35    [2032203]     Ответить | Цитировать Сообщить модератору
 Re: в цикле выполнить процедуру, на вход которой подать данные из запроса  [new]
Баскервиль
Member

Откуда:
Сообщений: 21
MOXHATOE
Исходные данные:
1. Есть процедура с набором входных параметров.
2. Есть таблица (переменная типа table) в которой хранятся наборы значений.
...

select @c = count(*) 
,      @i = 1
from @mytable
While @i <= @c begin
     exec myproc @a = select a from @mytable where id = @i
          ,      @b = select b from @mytable where id = @i
     set @i = @i + 1
end -- of while
...
...
Можно этого избежать?


А где уверенность, что id из @mytable непрерывно последовательно?
Зря отвергаете курсоры.
2 ноя 05, 17:02    [2032420]     Ответить | Цитировать Сообщить модератору
 Re: в цикле выполнить процедуру, на вход которой подать данные из запроса  [new]
MOXHATOE
Member

Откуда:
Сообщений: 67
Баскервиль
А где уверенность, что id из @mytable непрерывно последовательно?
Зря отвергаете курсоры.

id из @mytable это порядковый номер записи в таблице. Проставляется перед вызовом процедуры, поэтому однозначно непрерывный и последовательный.

Кстати, при выполнении описанной выше конструкции, аналайзер сожрал всю память на клиентской машине и благополучно завис :(
Придется видимо все же делать пакетную обработку, а не обработку по одной записи в цикле...
3 ноя 05, 10:20    [2034280]     Ответить | Цитировать Сообщить модератору
 Re: в цикле выполнить процедуру, на вход которой подать данные из запроса  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
MOXHATOE
Кстати, при выполнении описанной выше конструкции, аналайзер сожрал всю память на клиентской машине и благополучно завис

Поди условие выхода из цикла никогда не стало истинным, а?
3 ноя 05, 10:42    [2034370]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить