Se você deve iterate(*), use a construção projetada para fazer isso - o cursor . Muito difamado, mas se expressa mais claramente suas intenções, eu digo para usá-lo:
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
(*) Esta resposta recebeu alguns votos positivos recentemente, mas sinto que devo incorporar meu comentário original aqui também e adicionar alguns conselhos gerais:
Em SQL, você deve geralmente buscar uma solução baseada em conjuntos. A linguagem inteira é orientada em torno de soluções baseadas em conjuntos e (por sua vez) o otimizador é orientado em fazer com que as soluções baseadas em conjuntos funcionem bem. Por outro lado, as ferramentas que temos disponíveis para ajustar o otimizador também é orientado a conjuntos - por exemplo. aplicando índices a tabelas.
Existem algumas situações em que a iteração é a melhor abordagem. Estas são poucas, e podem ser comparadas às regras de Jackson sobre otimização - não faça isso - e (apenas para especialistas) não faça ainda .
Você está muito mais bem servido para primeiro tentar formular o que deseja em termos do conjunto de todas as linhas a serem afetadas - qual é a mudança geral a ser alcançada? - e, em seguida, tente formular uma consulta que encapsule esse objetivo. Somente se a consulta produzida não estiver funcionando adequadamente (ou se houver algum outro componente que não possa fazer nada além de lidar com cada linha individualmente), você deve considerar iteração.