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:
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>
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
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.
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