Pokud musíte iterate(*), použijte konstrukci určenou k tomu – kurzor . Hodně pomlouvané, ale pokud to nejjasněji vyjadřuje vaše záměry, říkám, použijte to:
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
(*) Tato odpověď nedávno získala několik kladných hlasů, ale mám pocit, že bych sem měl také začlenit svůj původní komentář a přidat nějaké obecné rady:
V SQL byste měli obecně hledat řešení založené na sadě. Celý jazyk je orientován na řešení založená na množinách a optimalizátor se zase orientuje na to, aby řešení založená na množinách dobře fungovala. Dále pak nástroje, které máme k dispozici pro ladění optimalizátor je také orientován na sadu - např. použití indexů na tabulky.
Existuje několik situace, kdy je iterace nejlepším přístupem. Těch je málo a lze je přirovnat k Jacksonovým pravidlům optimalizace – nedělejte to – a (pouze pro odborníky) to zatím nedělejte .
Mnohem lépe pro vás bude, když se nejprve pokusíte formulovat, co chcete z hlediska množiny všech řádků ovlivnit – jaké celkové změny má být dosaženo? - a pak se pokuste formulovat dotaz, který tento cíl zapouzdří. Pouze v případě, že dotaz vytvořený tímto způsobem nefunguje adekvátně (nebo existuje nějaká jiná komponenta, která není schopna dělat nic jiného než zabývat se každým řádkem jednotlivě), měli byste uvažovat iterace.