Funciones de cursor en SQL Server

Funciones de Cursor

Las funciones de cursor devuelven información de los cursores. (Ver cursores)

Las funciones de cursor son las siguientes:
@CURSOR_ROWS
CURSOR_STATUS
@@FETCH_STATUS

Función @Cursor_rows

Devuelve el número de filas del cursor abierto.

Valor devueltoDescripción
-mEl cursor se llena asincrónicamente. El valor –m es el número de filas actualmente en el conjunto de claves.
-1El cursor es dinámico. Como los cursores dinámicos reflejan todos los cambios, el número de filas correspondientes al cursor cambia constantemente. Nunca se puede afirmar que se han recuperado todas las filas que correspondan.
0No se han abierto cursores, no hay filas calificadas para el último cursor abierto, o éste se ha cerrado o su asignación se ha cancelado.
nEl cursor está completamente relleno. El valor devuelto (n) es el número total de filas del cursor.

Ejemplos

Usando Northwind
use Northwind
go

— Crear un cursor con los productos de categoría 5
— Antes de declarar y abrir el cursor
select @@CURSOR_ROWS
go
Resultado: 0

Declare CursorProductosCategoria5 cursor for
select * from Products where CategoryID = 5
go
Open CursorProductosCategoria5
go
Después de abrir el cursor
select @@CURSOR_ROWS
go
Resultado: -1
Leer los datos del cursor
Fetch CursorProductosCategoria5
go
Cerrar y Liberar el cursor
Close CursorProductosCategoria5
Deallocate CursorProductosCategoria5
go

Función @@FETCH_STATUS

Devuelve el estado de la última instrucción que lee los datos del cursor (Fetch). El tipo de dato devuelto es Entero.

Valor devueltoDescripción
0La instrucción FETCH se ejecutó correctamente y muestra registro.
-1La instrucción FETCH no se ejecutó correctamente y no muestra registro.
-2Falta la fila capturada.
-9El cursor no está realizando una operación de búsqueda.

Generalmente @@Fetch_Status es usada con la estructura While para leer los registros del cursor.

Ejemplo
— Crear un cursor para mostrar los Empleados
Declare cursorEmpleados Cursor for
select E.EmployeeID As ‘Código’, Empleado = E.LastName + Space(1)+ E.FirstName from Employees As E order by Empleado
Open cursorEmpleados
Fetch from cursorEmpleados
Print ‘========= EMPLEADOS ============= ‘
While @@FETCH_STATUS = 0
Begin
Fetch from cursorEmpleados
End
Close cursorEmpleados
Deallocate cursorEmpleados
go

Función Cursor_Status

Permite determinar si el resultado de un procedimiento almacenado ha devuelto un cursor y un conjunto de resultados al recibir un parámetro.

ValorDescripción
-1El cursor está cerrado.
1El cursor tiene al menos una fila.
0El conjunto de resultados del cursor está vacío.
-3No existe un cursor con el nombre indicado.

Ejemplo

Crear un cursor con las categorías
Antes de Crear el cursor
select CURSOR_STATUS (‘global’,’cursorCategorias’) As ‘Antes de Crear’
go
Resultado: -3

Declare cursorCategorias cursor for Select C.CategoryID, C.CategoryName from Categories As C
go
Antes de abrir el cursor
select CURSOR_STATUS (‘global’,’cursorCategorias’) As ‘Antes de abrir’
go
Resultado: -1

Despues de abrir el cursor
Open cursorCategorias
go
select CURSOR_STATUS (‘global’,’cursorCategorias’) As ‘Antes de abrir’
go
Resultado: 1

Despues de Cerrar el cursor
Close cursorCategorias
go
select CURSOR_STATUS (‘global’,’cursorCategorias’) As ‘Antes de abrir’
go
Resultado: -1