Cursores con variables tipo tabla

Cursor con variable tipo tabla en SQL Server

Los cursores guardan en memoria el resultado de una instrucción Select para luego poder recorrer los registros y poder con cada uno de ellos realizar algún tipo de trabajo.

Importante

  • Los cursores ocupan mucha memoria, evitar en lo posible el uso de estos y si deciden usarlos la cantidad de registros y los campos del select debería ser lo más selectiva posible.
  • Es recomendable guardar los datos del procesamiento del cursor en variables tipo tabla (Ver Variables tipo tabla) o tablas temporales (Ver tablas temporales) e incluir estos dentro de un procedimiento almacenado para ser consumido desde las aplicaciones.

En este artículo se presentan ejercicios de cursores con el uso de variables tipo tabla.

Usando la base de datos Northwind
use Northwind
go

Ejercicio 1

Crear un cursor que muestre el código del empleado y el número de órdenes de pedido emitidas
Declare @EmpleadosOrdenes table
( EmpleadoCodigo nchar(5),
EmpleadoNombreCompleto nvarchar(100),
EmpleadoCantidadOrdenes int
)
— Definir las variables
declare @EmpleadoCodigo nchar(5)
declare @EmpleadoNombreCompleto nvarchar(100)
declare @EmpleadoCantidadOrdenes int
— Crear el cursor
declare cursorEmpleadosOrdenes cursor for
select Right(‘0000’ + LTrim(Str(E.EmployeeID)),5) As ‘Código’,
Empleado = E.LastName + Space(1) + E.FirstName,
count(O.OrderID) As ‘Cantidad’
from Employees As E
join Orders As O on E.EmployeeID = O.EmployeeID
group by E.EmployeeID, E.LastName + Space(1) + E.FirstName
— Abrir el cursor
open cursorEmpleadosOrdenes
— Leer los datos a las variables del primer registro
fetch next from cursorEmpleadosOrdenes
into @EmpleadoCodigo,@EmpleadoNombreCompleto, @EmpleadoCantidadOrdenes
while @@FETCH_STATUS =0 — recorrer el cursor
begin
insert @EmpleadosOrdenes values (@EmpleadoCodigo,@EmpleadoNombreCompleto, @EmpleadoCantidadOrdenes)
fetch next from cursorEmpleadosOrdenes
into @EmpleadoCodigo,@EmpleadoNombreCompleto, @EmpleadoCantidadOrdenes
end
close cursorEmpleadosOrdenes
deallocate cursorEmpleadosOrdenes
select * from @EmpleadosOrdenes order by EmpleadoCantidadOrdenes desc
go

Resultado del cursor de empleados.

Ejercicio 2

Crear un cursor que muestre un producto y la cantidad de unidades vendidas y el monto total generado.
— Crear la variable tipo tabla
Declare @ProductosTotales table
(ProductoCodigo nchar(5), ProductoDescripcion nvarchar(50),
ProductoTotalUnidades Numeric(9,2), ProductosMontoTotal Numeric(9,2))
— Crear las variables para que el cursos guarde los datos
declare @ProductoCodigo nchar(5)
declare @ProductoDescripcion nvarchar(50)
declare @ProductoTotalUnidades Numeric(9,2)
declare @ProductosMontoTotal Numeric(9,2)
— Crear el cursor
declare CursorProductosTotales cursor for
select Right(‘0000’ + LTrim(Str(P.ProductID)),5) As ‘Código’,
P.ProductName As ‘Descripción’,
Sum(D.Quantity) As ‘Cantidad’,
Sum(D.Quantity * D.UnitPrice) As ‘Monto Total’
from Products As P
join [Order Details] As D on P.ProductID = D.ProductID
group by P.ProductID, P.ProductName
open CursorProductosTotales
fetch next from CursorProductosTotales into @ProductoCodigo, @ProductoDescripcion,
@ProductoTotalUnidades, @ProductosMontoTotal
— Recorrer el cursor
while @@fetch_status = 0
begin
insert @ProductosTotales values (@ProductoCodigo, @ProductoDescripcion,
@ProductoTotalUnidades, @ProductosMontoTotal)
fetch next from CursorProductosTotales into @ProductoCodigo, @ProductoDescripcion,
@ProductoTotalUnidades, @ProductosMontoTotal
end
close CursorProductosTotales
deallocate CursorProductosTotales
select * from @ProductosTotales order by ProductoDescripcion
go