Ако трябва iterate(*), използвайте конструкцията, предназначена да го направи - курсора . Много злословен, но ако най-ясно изразява намеренията ви, казвам да го използвате:
DECLARE @ID int
DECLARE IDs CURSOR LOCAL FOR select ID from SAMPLE where Name = @NameParameter
OPEN IDs
FETCH NEXT FROM IDs into @ID
WHILE @@FETCH_STATUS = 0
BEGIN
exec myproc @ID
FETCH NEXT FROM IDs into @ID
END
CLOSE IDs
DEALLOCATE IDs
(*) Този отговор получи няколко положителни гласа наскоро, но смятам, че трябва да включа и оригиналния си коментар тук и да добавя някои общи съвети:
В SQL трябва по принцип потърсете базирано на набор решение. Целият език е ориентиран към базирани на набори решения и (на свой ред) оптимизаторът е ориентиран към това да накара базираните на набори решения да работят добре. На свой ред инструментите, които имаме на разположение за настройка оптимизаторът също е ориентиран към множество - напр. прилагане на индекси към таблици.
Има няколко ситуации, при които итерацията е най-добрият подход. Това са малко и могат да бъдат оприличени на правилата на Джаксън за оптимизиране - не го правете - и (само за експерти) не го правете още .
Много по-добре е първо да се опитате да формулирате какво искате по отношение на набора от всички редове, които да бъдат засегнати - каква е общата промяна, която трябва да се постигне? - и след това се опитайте да формулирате заявка, която капсулира тази цел. Само ако заявката, получена по този начин, не се изпълнява адекватно (или има някакъв друг компонент, който не може да направи нищо друго освен да се справи с всеки ред поотделно), трябва да помислите итерация.