Si debe iterar (*), use la construcción diseñada para hacerlo:el cursor . Muy difamado, pero si expresa más claramente tus intenciones, te digo que lo uses:
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 respuesta recibió algunos votos a favor recientemente, pero creo que debería incorporar mi comentario original aquí también y agregar algunos consejos generales:
En SQL, debe generalmente buscar una solución basada en conjuntos. Todo el lenguaje está orientado en torno a soluciones basadas en conjuntos y (a su vez) el optimizador está orientado en hacer que las soluciones basadas en conjuntos funcionen bien. A su vez, las herramientas que tenemos disponibles para tuning el optimizador también está orientado a conjuntos, p. aplicando índices a las tablas.
Hay algunos pocos situaciones en las que la iteración es el mejor enfoque. Estas son pocas y pueden compararse con las reglas de optimización de Jackson:no lo hagas y (solo para expertos) no lo hagas todavía .
Es mucho mejor que primero intente formular lo que desea en términos del conjunto de todas las filas que se verán afectadas:¿cuál es el cambio general que se logrará? - y luego intente formular una consulta que encapsule ese objetivo. Solo si la consulta generada al hacerlo no funciona adecuadamente (o si hay algún otro componente que no puede hacer nada más que manejar cada fila individualmente) debería considerar iteración.