Прокрутите все строки временной таблицы и вызовите хранимую процедуру для каждой строки
Я объявил временную таблицу для хранения всех необходимых значений следующим образом:
DECLARE @temp TABLE
(
Password int,
IdTran int,
Kind varchar(16)
)
INSERT INTO @temp
SELECT s.Password, s.IdTran, 'test'
from signal s inner join vefify v
on s.Password = v.Password
and s.IdTran = v.IdTran
and v.type = 'DEV'
where s.[Type] = 'start'
AND NOT EXISTS (SELECT * FROM signal s2
WHERE s.Password = s2.Password
and s.IdTran = s2.IdTran
and s2.[Type] = 'progress' )
INSERT INTO @temp
SELECT s.Password, s.IdTran, 'test'
from signal s inner join vefify v
on s.Password = v.Password
and s.IdTran = v.IdTran
and v.type = 'PROD'
where s.[Type] = 'progress'
AND NOT EXISTS (SELECT * FROM signal s2
WHERE s.Password = s2.Password
and s.IdTran = s2.IdTran
and s2.[Type] = 'finish' )
Теперь мне нужно прокрутить строки в таблице @temp и для каждой строки вызывать sp, который принимает все параметры таблицы @temp в качестве входных данных.
Как я могу достичь этого?
Ответы
Ответ 1
вам нужно использовать курсор:
DECLARE @id int
DECLARE @pass varchar(100)
DECLARE cur CURSOR FOR SELECT Id, Password FROM @temp
OPEN cur
FETCH NEXT FROM cur INTO @id, @pass
WHILE @@FETCH_STATUS = 0 BEGIN
EXEC mysp @id, @pass ... -- call your sp here
FETCH NEXT FROM cur INTO @id, @pass
END
CLOSE cur
DEALLOCATE cur
Ответ 2
Попробуйте вернуть набор данных из хранимой процедуры в ваш datatable на С# или VB.Net. Затем большой объем данных в вашем datatable можно скопировать в таблицу назначения с помощью массовой копии. Я использовал BulkCopy для загрузки больших данных с тысячами строк в таблицы Sql с большим успехом с точки зрения производительности.
Вы можете поэкспериментировать с BulkCopy в коде С# или VB.Net.
Ответ 3
что-то вроде этого?
DECLARE maxval, val, @ind INT;
SELECT MAX(ID) as maxval FROM table;
while (ind <= maxval ) DO
select `value` as val from `table` where `ID`=ind;
CALL fn(val);
SET ind = ind+1;
end while;
Ответ 4
Для этого вам не нужен курсор. Вы можете сделать это с циклом while. Вы должны избегать курсоров, когда это возможно. Хотя цикл быстрее, чем курсоры.