Uso de cursores en Transact SQL

En T-SQL (Transact SQL) podemos definir una variable que nos permite recorrer un conjunto de resultados obtenidos a través de una SELECT fila a fila, ha esta variable se le denomina Cursor

Cuando trabajemos con cursores debemos seguir los siguientes pasos:

  • Declarar el cursor, utilizando DECLARE
  • Abrir el cursor, utilizando OPEN
  • Leer los datos del cursor, utilizando FETCHINTO
  • Cerrar el cursor, utilizando CLOSE
  • Liberar el cursor, utilizando DEALLOCATE

Ejemplo de cursor T-SQL– Declaración del cursor

DECLARE <nombre_cursor> CURSOR
FOR
<sentencia_sql>
-- apertura del cursor
OPEN <nombre_cursor>
-- Lectura de la primera fila del cursor
FETCH <nombre_cursor> INTO <lista_variables>
WHILE (@@FETCH_STATUS = 0)
BEGIN
    -- Lectura de la siguiente fila de un cursor
    FETCH <nombre_cursor> INTO <lista_variables>
    ...
END -- Fin del bucle WHILE
-- Cierra el cursor
CLOSE <nombre_cursor>
-- Libera los recursos del cursor
DEALLOCATE <nombre_cursor>

Usos de un cursor

Utilizar un cursor es muy práctico ya que nos permite por ejemplo, trabajar con los datos de una fila, operar sobre esos datos y por ejemplo, actualizar el registro, con el resultado de las operaciones. Para dar un mejor ejemplo, para realizar una actualización de unos registros que deben tomar el valor calculado en función de otros datos del mismo registro.

DECLARE @fechaInicio varchar(30),  /*Declaramos variables*/
	@fechaFin varchar(30),
	@idFactura int,
	@fechaCalculos datetime
SET @fechaInicio = '1/1/2005'; /*Seteamos variables*/
SET @fechaFin = '1/1/2006';
DECLARE miCursor CURSOR
FOR
/*Especificamos la select*/
select id,fecha as fechaCalculos from FACTURAS_CLIENTES
where fecha >= CONVERT(DATETIME,@fechaInicio,103)
AND fecha <= CONVERT(DATETIME,@fechaFin,103)
OPEN miCursor  /*Abrimos el cursor*/
	FETCH miCursor INTO @idFactura, @fechaCalculos 

/*Asignamos cada columna de la SELECT
a una variable definida arriba*/
WHILE(@@FETCH_STATUS = 0)
BEGIN
  SET @fechaCalculos = @fechaCalculos + 10 -- OPERACION
 -- Mostramos el resultado
 PRINT 'FECHA CALCULOS:'+ CAST(@fechaCalculos  as varchar)
/*Importante volver a hacer el FETCH*/
FETCH miCursor INTO @idFactura, @fechaCalculos  

END
CLOSE miCursor
DEALLOCATE miCursor

Conclusión

Aunque en un principio parezca algo difícil de entender es sencillo si se sigue correctamente la estructura del cursor. Así además evitamos fallos en la sintaxis.

Usar un cursor nos puede simplificar mucho la tarea de programar un script en otro lenguaje de programación para acabar haciendo lo mismo que con un cursor programador directamente sobre T-SQL, que además se ejecutará más rápido.



								
				
									
			

2 Comentarios en “Uso de cursores en Transact SQL”

7th Sign dice:

hola que tal,
lo que mencionas sobre cursores es verdad, ayudan mucho pero las mejores prácticas recomiendan utilizar estos como último recurso, ya que hacen lento el sistema.

http://www.configuracionesintegrales.com/miguele/cursores.asp?articulo=295
en esta URL dan una explicación sobre el rendimiento que tienen los cursores.
yo en lo particular uso variables tipo tabla o tablas temporales cuando el manejo de datos es muy grande.

saludos

Julio C. Campos dice:

Muy buen Ej. gracias.

Dejar un comentario

*