Implementación de Funciones y Cursores en Transact-SQL para Gestión Deportiva
1. Función Escalar: Determinación del Estado de Convocatoria
La siguiente función definida por el usuario (UDF), denominada fn_EstadoConvocatoria, evalúa la condición de un jugador para un encuentro deportivo a partir de tres criterios: lesiones activas, sanciones disciplinarias y fatiga acumulada.
CREATE FUNCTION fn_EstadoConvocatoria (@JugID INT)
RETURNS VARCHAR(50) AS
BEGIN
DECLARE @Resultado VARCHAR(50) = 'DISPONIBLE';
DECLARE @Edad INT, @Minutos INT, @Lesionado INT, @Sancionado INT;
-- 1. Comprobar lesiones activas
SELECT @Lesionado = COUNT(*)
FROM Lesiones
WHERE JugadorID = @JugID AND FechaFin IS NULL;
-- 2. Comprobar sanción (último partido registrado)
SELECT TOP 1 @Sancionado = COUNT(*)
FROM Tarjetas
WHERE JugadorID = @JugID AND Color = 'Roja'
ORDER BY FechaPartido DESC;
-- 3. Comprobar fatiga acumulada
SELECT @Edad = Edad, @Minutos = MinutosJugados
FROM Jugadores
WHERE JugadorID = @JugID;
-- Evaluación de condiciones
IF @Lesionado > 0
SET @Resultado = 'LESIONADO';
ELSE IF @Sancionado > 0
SET @Resultado = 'SANCIONADO';
ELSE IF @Edad > 34 AND @Minutos > 3000
SET @Resultado = 'DESCANSO RECOMENDADO';
RETURN @Resultado;
END;
GO2. Script Transact-SQL: Ajuste Automático de Masa Salarial mediante Cursores
El siguiente bloque evalúa la masa salarial por equipo mediante cursores anidados. Si una plantilla supera el tope establecido en 10.000.000, aplica una reducción progresiva del 10 % a los salarios más altos de forma descendente hasta cumplir con el límite financiero.
DECLARE @EqID INT, @EqNom VARCHAR(50), @SumaSalarios FLOAT, @Exceso FLOAT,
@JugID INT, @JugSueldo FLOAT, @ReduccionTotal FLOAT;
-- Cursor principal: Recorrido de equipos
DECLARE curEquipos CURSOR FOR
SELECT EquipoID, NombreEquipo
FROM Equipos;
OPEN curEquipos;
FETCH NEXT FROM curEquipos INTO @EqID, @EqNom;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @SumaSalarios = SUM(Sueldo)
FROM Jugadores
WHERE EquipoID = @EqID;
SET @ReduccionTotal = 0;
-- Validación de superación del tope salarial (10.000.000)
IF @SumaSalarios > 10000000
BEGIN
SET @Exceso = @SumaSalarios - 10000000;
PRINT 'Equipo ' + @EqNom + ' supera el límite por ' + CAST(@Exceso AS VARCHAR);
-- Cursor secundario: Ajuste individual ordenado por mayor salario
DECLARE curAjuste CURSOR FOR
SELECT JugadorID, Sueldo
FROM Jugadores
WHERE EquipoID = @EqID
ORDER BY Sueldo DESC;
OPEN curAjuste;
FETCH NEXT FROM curAjuste INTO @JugID, @JugSueldo;
WHILE @@FETCH_STATUS = 0 AND @SumaSalarios > 10000000
BEGIN
-- Reducción del 10% sobre el salario actual
UPDATE Jugadores
SET Sueldo = Sueldo * 0.9
WHERE JugadorID = @JugID;
SET @ReduccionTotal = @ReduccionTotal + (@JugSueldo * 0.1);
SET @SumaSalarios = @SumaSalarios - (@JugSueldo * 0.1);
FETCH NEXT FROM curAjuste INTO @JugID, @JugSueldo;
END;
CLOSE curAjuste;
DEALLOCATE curAjuste;
PRINT ' Reducción aplicada: ' + CAST(@ReduccionTotal AS VARCHAR);
END;
FETCH NEXT FROM curEquipos INTO @EqID, @EqNom;
END;
CLOSE curEquipos;
DEALLOCATE curEquipos;Puntos Clave del Proceso
- Determinación de disponibilidad: Prioriza el descarte por motivos de salud (lesión), seguido de restricciones disciplinarias (sanción) y, finalmente, gestión de carga física (edad y minutos jugados).
- Control presupuestario iterativo: Emplea cursores de T-SQL para iterar sobre conjuntos de datos jerárquicos (equipos y jugadores) permitiendo modificaciones registro a registro según el umbral financiero fijado.