sql >> Base de Datos >  >> RDS >> Sqlserver

Iterar a través de filas en SQL Server 2008

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.