Uso de Cursores SQL Server
En muchas ocasiones deseamos realizar acciones sobre un conjunto de datos y que dichas acciones se puedan realizar fila a fila. Es aquí donde son importantes los cursores. Vamos a ver el uso de ellos de una forma simple:
Para declarar un cursor, hacemos lo siguiente:
DECLARE MiCursor CURSOR FOR
De esta manera estamos definiendo nuestro cursor; podemos implementar el nombre que deseemos.
Luego de la instrucción CURSOR FOR, SQL estará esperando la consulta que utilizaremos para el cursor, de esta manera la consulta quedaría así:
DECLARE MiCursor CURSOR FOR
SELECT Placa, Modelo FROM tblAutos
Posterior a la definición del cursor procedemos con su apertura, con cual SQL ejecutará la sentencia definida en el cursor.
OPEN MiCursor
El paso a seguir es empezar a recorrer los resultados obtenidos, fila a fila, y almecenar los datos de las columnas en variables. Es importante tener en cuenta que la cantidad de variables dependerá de las columnas definidas en la consulta. Estas variables pueden ser definidas antes del cursor:
FETCH NEXT FROM MiCursor INTO @placa, @modelo
Ya tenemos los resultados de una fila en las respectivas variables. Ahora necesitamos una instrucción que nos ayude a identificar cuando se termina de recorrer la cantidad de filas en la consulta. Para ello usaremos una variable de SQL llamada @@FETCH_STATUS, la cual nos retornará el valor de 0 si la lectura de la fila fue correcta, en caso contrario terminaremos de recorrer el cursor:
WHILE @@FETCH_STATUS = 0
Luego de ello, comenzaremos a realizar las tareas que necesitemos, para efecto de este ejemplo realizaremos un update y finalmente cerraremos y liberaremos el cursor con las sentencias close y deallocate:
DECLARE @placa VARCHAR(10)
DECLARE @modelo VARCHAR(30)
DECLARE MiCursor CURSOR FOR
SELECT Placa, Modelo FROM tblAutos
OPEN MiCursor
FETCH NEXT FROM MiCursor INTO @placa, @modelo
WHILE @@FETCH_STATUS =0
BEGIN
UPDATE tblAutos SET Descripcion = CONCAT(@placa, @modelo)
FETCH NEXT FROM MiCursor INTO @placa, @modelo
END
CLOSE MiCursor
DEALLOCATE MiCursor
Y eso sería todo.