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

¿Cómo ejecuto un procedimiento almacenado una vez por cada fila devuelta por la consulta?

usa un cursor

ANEXO:[ejemplo de cursor de MS SQL]

declare @field1 int
declare @field2 int
declare cur CURSOR LOCAL for
    select field1, field2 from sometable where someotherfield is null

open cur

fetch next from cur into @field1, @field2

while @@FETCH_STATUS = 0 BEGIN

    --execute your sproc on each row
    exec uspYourSproc @field1, @field2

    fetch next from cur into @field1, @field2
END

close cur
deallocate cur

en MS SQL, aquí hay un artículo de ejemplo

tenga en cuenta que los cursores son más lentos que las operaciones basadas en conjuntos, pero más rápidos que los bucles while manuales; más detalles en esta pregunta SO

ANEXO 2:si va a procesar más de unos pocos registros, llévelos primero a una tabla temporal y pase el cursor sobre la tabla temporal; esto evitará que SQL escale a bloqueos de tabla y acelerará la operación

ANEXO 3:y, por supuesto, si puede alinear lo que sea que su procedimiento almacenado esté haciendo con cada ID de usuario y ejecutarlo todo como una sola declaración de actualización de SQL, eso sería óptimo