Подтвердить что ты не робот

Прокрутите все строки временной таблицы и вызовите хранимую процедуру для каждой строки

Я объявил временную таблицу для хранения всех необходимых значений следующим образом:

    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 в качестве входных данных. Как я могу достичь этого?

4b9b3361

Ответ 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. Вы должны избегать курсоров, когда это возможно. Хотя цикл быстрее, чем курсоры.