Cursores en SQL Server

Uno de los bucles muy utilizados además del FOR, hablamos de los cursores en SQL Server, utilizado al trabajar con múltiples tablas.

Un cursor es una instrucción que permite recorrer el conjunto de filas de una consulta SELECT y trabajar con ellos durante el bucle.

Componentes del cursor

Veamos las partes que componen un cursor, comencemos con la declaración de variables.

DECLARE @Nombre VARCHAR(15), @Apellido VARCHAR(15);

Declaro dos variables para el nombre y el apellido de los empleados, en estos guardaremos los datos en el bucle.

Podría interesarte Consultar a SQL Server desde ASP.Net C#  

Creamos o declaramos el cursor, para el ejemplo lo llamare CursorUno.

DECLARE CursorUno CURSOR FOR

Realizamos la consulta SELECT a la base de datos, esta es una consulta normal, sin ninguna particularidad para el cursor.

SELECT FirstName, LastName FROM Employees;

Es momento de hacer uso del cursor, Abrimos con OPEN seguido del nombre del cursor declarado.

OPEN CursorUno

Asignamos el resultado de la consulta SELECT a las variables declaradas mediante el siguiente código.

FETCH NEXT FROM CursorUno INTO @Nombre, @Apellido
  • Establecemos el nombre del cursor.
  • Mediante INTO guardamos el resultado de la consulta a las variables específicas.
  • El orden de las variables en el FETCH debe ser el mismo orden de las columnas de la consulta SELECT.
  • Debe haber el mismo número de variables para el numero de columnas del SELECT.
  • Si el SELECT tiene más columnas, solo se tomarán las primeras de acuerdo con el número de variables colocadas.

Utilizamos el bucle WHILE para el recorrido de la consulta.

WHILE @@FETCH_STATUS = 0

Mediante FECHT_ESTATUS establecemos la condición de alto del bucle, una vez que la fila siguiente (FETCH) sea 0.

Realizamos las operaciones correspondientes y utilizamos las variables.

PRINT @Nombre + ' ' + @Apellido

Para mi ejemplo únicamente muestro con la sección de mensajes los nombres de los empleados.

Damos paso a la siguiente fila.

FETCH NEXT FROM CursorUno INTO @Nombre, @Apellido

Este FETCH es similar al colocado antes del WHILE, si no se coloca se producirá un error.

Únicamente nos queda cerrar las instrucciones, primero con el END del WHILE.

Cerramos el cursor CursorUNO y por último liberamos todos los recursos utilizados.

CLOSE CursorUno
DEALLOCATE CursorUno

Cursor completo

En resumen, todo el código descrito anteriormente quedaría de la siguiente manera.

--Declarar los variables
DECLARE @Nombre VARCHAR(15), @Apellido VARCHAR(15);

DECLARE CursorUno CURSOR FOR --Declarar el CURSOR
SELECT FirstName, LastName FROM Employees; --Consulta de datos, el resultado será recorrido por el CURSOR

OPEN CursorUno --Abrir el CURSOR
	FETCH NEXT FROM CursorUno INTO @Nombre, @Apellido --Leer primera fila de la consulta SELECT

	WHILE @@FETCH_STATUS = 0 BEGIN
		PRINT @Nombre + ' ' + @Apellido --Ejecutar operaciones

		FETCH NEXT FROM CursorUno INTO @Nombre, @Apellido --Leer la fila siguiente de la consulta SELECT
	END --Fin del WHILE

CLOSE CursorUno --Cerrar el CURSOR
DEALLOCATE CursorUno --Liberar recursos

Al ejecutar esta instrucción podemos observar un resultado similar a esto.

Cursores en SQL Server

Podría interesarte Ciclo while en SQL Server  

Nota: los ejemplos son probadas utilizando la base de datos Northwind, la puedes obtener el enlace siguiente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *