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