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