Uso de Cursores SQL Server

03.06.2018 12:37

 

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.