Jeśli musisz iterate(*), użyj konstrukcji zaprojektowanej do tego celu — kursor . Bardzo oczerniany, ale jeśli najdobitniej wyraża twoje intencje, mówię, użyj go:
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
(*) Ta odpowiedź otrzymała ostatnio kilka głosów za, ale uważam, że powinienem zamieścić tutaj również mój oryginalny komentarz i dodać kilka ogólnych rad:
W SQL należy ogólnie szukaj rozwiązania opartego na zbiorze. Cały język jest zorientowany na rozwiązania oparte na zbiorach, a (z kolei) optymalizator jest zorientowany na sprawienie, aby rozwiązania oparte na zbiorach działały dobrze. Z kolei dostępne narzędzia do dostrajania optymalizator jest również zorientowany na zbiór - np. stosowanie indeksów do tabel.
Jest kilka sytuacje, w których najlepszym podejściem jest iteracja. Niewiele z nich jest daleko i można je porównać do zasad Jacksona dotyczących optymalizacji – nie rób tego – i (tylko dla ekspertów) nie rób tego jeszcze .
O wiele lepiej jest, jeśli najpierw spróbujesz sformułować to, czego chcesz w odniesieniu do zestawu wszystkich wierszy, na które ma to mieć wpływ – jaka jest ogólna zmiana, którą należy osiągnąć? - a następnie spróbuj sformułować zapytanie, które zawiera ten cel. Tylko jeśli zapytanie utworzone w ten sposób nie działa odpowiednio (lub istnieje jakiś inny składnik, który nie jest w stanie zrobić niczego innego niż radzenie sobie z każdym wierszem osobno), powinieneś rozważyć iteracja.