post icon

Como crear cursores en SQL Server

A través de un cursor podemos recorrer filas de un conjunto de resultados, es decir, lo que devuelva una sentecia SELECT, y el mismo tiene una manera única de operar basada en su declaración, apertura, lectura, cierre y destrucción.

En muchos casos es la única manera de resolver un problema, pero no en todos ya que hay contextos en donde pueden ser resueltos de más de una forma evitando los cursores. Personalmente recomiendo usar la menor cantidad de estos ya que consumen muchos recursos del servidor y no se destaca precisamente en su velocidad de ejecución. Además que si trabajamos una regla larga de negocio es luego dificil mantenerlo (ya recuerdo un caso de un SP con 14 Cursores anidados, era la destrucción!) .

La declaración

El cursor debe ser declarado como si fuera una variable más de éste modo:

DECLARE <nombre_cursor> CURSOR
FOR <sentencia_sql>

*Al momento de declarar el cursor podemos asignar distintos comportamientos del mismo con parametros opcionales como sigue:

DECLARE <nombre_cursor> CURSOR
   [ LOCAL | GLOBAL ]
   [ FORWARD_ONLY | SCROLL ]
   [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
   [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
   [ TYPE_WARNING ]
FOR

También debemos considerar que por cada columna que tendrá el SELECT del cursor debemos tener una variable del mismo tipo para volcar la fila en éstas.

DECLARE <@nombre_variable> <tipo_dato>,
	<@nombre_variable> <tipo_dato>,
	<@nombre_variable> <tipo_dato>,
	<@nombre_variable> <tipo_dato>

La Apertura

Una vez declarado que Query cargará el cursor lo podemos abrir

OPEN <nombre_cursor>

Lectura

El proceso de la lectura se puede decir que consta de dos partes, la lectura inicial y la lectura posterior, la misma debe ser evaluada si fue leída correctamento o no con la variable global @@FETCH_STATUS. Los posibles valores de ésta variable son:

 0 = La instrucción FETCH se ejecutó exitosamente
-1 = Falló la instrucción FETCH o ya no había filas que leer
-2 = Fala la fila recuperada por el FETCH
-- Lectura de la primer fila
FETCH <nombre_cursor> INTO <lista_variables>

-- Verificar el estado del cursor para continuar leyendo o deternerse
WHILE (@@FETCH_STATUS = 0)
BEGIN
   -- Lectura de la siguiente fila del cursor
   FETCH <nombre_cursor> INTO <lista_variables>
END

Cierre del Cursor

Cuando sea necesario cerramos el cursor, el cual confirma la transacción implícita que lleva pero no libera aún los recursos del servidor.

CLOSE <nombre_cursor>

Destrucción/Liberación del Cursor

DEALLOCATE <nombre_cursor>

Ejemplo de Cursor

DECLARE @Id int,
		@Nombre varchar(50),
		@Apellido varchar(50),
		@FechaIngreso date;

DECLARE curAlumnos CURSOR FOR
SELECT  Id, Nombre, Apellido, FechaIngreso
FROM ALUMNOS;

OPEN curAlumnos;

FETCH curAlumnos INTO @id, @Nombre, @Apellido, @FechaIngreso;

WHILE (@@FETCH_STATUS = 0)
BEGIN
	-- A modo de ejemplo imprimo las variable, ustedes destrozarán código aquí
	PRINT @Nombre + ' ' + @Apellido;

	FETCH NEXT FROM curAlumnos INTO  @id, @Nombre, @Apellido, @FechaIngreso;
END

CLOSE curAlumnos;

DEALLOCATE curAlumnos;

Nota: * Para mayor detalle de que hace cada opción al momento de declarar un cursor pueden consultar la ayuda oficial del MSDN

Comentarios desde Facebook:

Sin Comentarios aun, puedes tú ser el primero en comentar!

Deja tu Comentario

Responder