Если вы должны повторить (*), используйте конструкцию, предназначенную для этого - курсор .Много оскорблено, но если оно наиболее четко выражает ваши намерения, я говорю, используйте его:
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 вы должны обычно искать решение на основе множеств.Весь язык ориентирован на решения на основе множеств, и (в свою очередь) оптимизатор ориентирован на то, чтобы решения на основе множеств работали хорошо.В дальнейшем, инструменты, которые мы имеем в наличии для настройки оптимизатора, также ориентированы на наборы - например, применяют индексы к таблицам.
Есть несколько ситуаций, когдаитерация - лучший подход.Эти немногие далеки друг от друга и могут быть уподоблены правилам Джексона по оптимизации - не делайте этого - и (только для экспертов) не делайте этого пока .
Вы 'Намного лучше сначала попытаться сформулировать, что вы хотите, с точки зрения набора всех строк, на которые нужно воздействовать - каково общее изменение, которое должно быть достигнуто?- а затем попытайтесь сформулировать запрос, который инкапсулирует эту цель.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}}}}} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}}}}}}}