Unidad 5 SQL Procedimientos

Unidad 5: SQL Procedimental
Lógica de Negocio en la Capa de Datos con SQL Server 2025
¿Por qué es vital el SQL Procedimental en SQL Server 2025?
El lenguaje Transact-SQL (T-SQL) estándar es declarativo, lo que significa que le indicamos al servidor qué datos queremos pero no cómo procesarlos paso a paso. El SQL Procedimental extiende T-SQL incorporando control de flujo (bucles, condiciones, manejo de excepciones) y la capacidad de encapsular reglas de negocio complejas directamente dentro del motor del SGBD.
🚀 Rendimiento Optimizado
Reduce drásticamente el tráfico de red enviando únicamente las llamadas de ejecución y no bloques masivos de consultas T-SQL.
🛡️ Seguridad Granular
Permite otorgar permisos de ejecución sobre objetos de procedimiento sin exponer la lectura o modificación directa de las tablas subyacentes.
🔄 Reutilización y Mantenimiento
Centraliza la lógica empresarial en un solo lugar. Si la regla cambia, solo se modifica el objeto procedural en el servidor.
5.1 Procedimientos Almacenados (Stored Procedures)
Un Stored Procedure (SP) es una colección ejecutable de sentencias T-SQL precompiladas. Puede recibir parámetros de entrada (IN), devolver valores a través de parámetros de salida (OUTPUT) y retornar conjuntos de datos completos o códigos de estado.
Sintaxis y Ejemplo Práctico en T-SQL
-- Creación de un Stored Procedure con parámetros de Entrada y Salida
CREATE PROCEDURE dbo.usp_RegistrarVenta
@ClienteID INT,
@Monto DECIMAL(10,2),
@VentaID INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
INSERT INTO Ventas (ClienteID, Fecha, Total)
VALUES (@ClienteID, GETDATE(), @Monto);
SET @VentaID = SCOPE_IDENTITY();
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
THROW;
END CATCH
END;
GO
5.2 Funciones Definidas por el Usuario (UDF)
Las User-Defined Functions (UDF) son estructuras que aceptan parámetros, realizan una acción o cálculo y siempre devuelven un resultado. A diferencia de los Stored Procedures, las funciones **no pueden modificar el estado global de la base de datos** (no se permiten sentencias DML como INSERT, UPDATE o DELETE sobre tablas del sistema).
Tipos Principales de Funciones
1. Escalares (Scalar UDF)
Devuelven un **único valor** (un entero, cadena, fecha, etc.). Se invocan directamente en cláusulas SELECT o WHERE.
2. Tabla en Línea (Inline TVF)
Devuelven un conjunto de datos (tipo TABLE) basado en una sola sentencia SELECT. Son tratadas eficientemente por el optimizador.
3. Tabla Multisentencia (MSTVF)
Construyen una tabla temporal dentro de un bloque declarativo con múltiples sentencias complejas antes de retornar.
-- Ejemplo: Función Escalar para Calcular IVA
CREATE FUNCTION dbo.ufn_CalcularIVA (@Monto DECIMAL(10,2))
RETURNS DECIMAL(10,2)
AS
BEGIN
RETURN @Monto * 0.16;
END;
GO
-- Uso de la función en una consulta:
SELECT Producto, Precio, dbo.ufn_CalcularIVA(Precio) AS IVA FROM Productos;
5.3 Disparadores (Triggers)
Un Trigger es un tipo especial de procedimiento almacenado que se ejecuta **automáticamente** cuando ocurre un evento específico en el servidor de base de datos.
⚡ Triggers DML
Se activan con eventos de manipulación de datos: INSERT, UPDATE o DELETE.
- AFTER / FOR: Se ejecuta después de completar las validaciones de restricciones y la acción.
- INSTEAD OF: Reemplaza la acción original por la lógica programada en el disparador.
🛡️ Triggers DDL
Se activan ante modificaciones estructurales como CREATE_TABLE, ALTER_TABLE o DROP_TABLE para auditoría o prevención.
INSERTED: Contiene las nuevas filas agregadas o actualizadas.DELETED: Contiene las filas eliminadas o los valores previos a una actualización.
-- Ejemplo: Trigger de Auditoría Automática tras Modificar Empleados
CREATE TRIGGER trg_AuditoriaEmpleados
ON Empleados
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Auditoria_Log (Tabla, Accion, Usuario, Fecha)
SELECT 'Empleados', 'UPDATE', SYSTEM_USER, GETDATE()
FROM INSERTED;
END;
GO
Ejercicios Prácticos Guiados
Requerimiento: Diseña un procedimiento usp_ActualizarStock que reciba un @ProductoID y la @CantidadVendida. Debe verificar si hay existencias suficientes antes de descontar.
CREATE PROCEDURE dbo.usp_ActualizarStock
@ProductoID INT,
@CantidadVendida INT
AS
BEGIN
IF EXISTS (SELECT 1 FROM Productos WHERE ProductoID = @ProductoID AND Stock >= @CantidadVendida)
BEGIN
UPDATE Productos
SET Stock = Stock - @CantidadVendida
WHERE ProductoID = @ProductoID;
PRINT 'Stock actualizado con éxito.';
END
ELSE
BEGIN
RAISERROR('Stock insuficiente para realizar la operación.', 16, 1);
END
END;
Requerimiento: Crear un Trigger INSTEAD OF DELETE para evitar que se eliminen clientes que tengan facturas registradas.
CREATE TRIGGER trg_PrevenirBorradoClientes
ON Clientes
INSTEAD OF DELETE
AS
BEGIN
IF EXISTS (
SELECT 1 FROM Facturas f
JOIN DELETED d ON f.ClienteID = d.ClienteID
)
BEGIN
RAISERROR('No se puede eliminar el cliente porque posee facturas asociadas.', 16, 1);
END
ELSE
BEGIN
DELETE FROM Clientes WHERE ClienteID IN (SELECT ClienteID FROM DELETED);
END
END;
Examen de Conocimientos
Evaluación Interactiva sobre SQL Procedimental en SQL Server 2025.
SQL Server: Procedimientos, Funciones y Triggers
Comprende cómo los objetos programables convierten consultas aisladas en soluciones seguras, reutilizables y fáciles de mantener.
Comenzar la lección¿Qué son los procedimientos en SQL Server?
Un procedimiento almacenado es un conjunto de instrucciones T-SQL guardado dentro de la base de datos. En lugar de repetir una consulta en cada aplicación, se crea una vez, se valida y se ejecuta cuando se necesita.
Lógica cerca de los datos
Agrupa reglas, consultas y transacciones en un punto controlado de SQL Server.
Acceso controlado
Permite otorgar permisos para ejecutar una acción sin exponer directamente las tablas.
Menos repetición
La misma lógica sirve a reportes, APIs y aplicaciones sin copiar y pegar código.
Una receta ejecutable dentro de la base de datos
Los procedimientos almacenados reciben parámetros, realizan una tarea y pueden devolver conjuntos de resultados, valores de salida o códigos de estado. Son ideales para operaciones de negocio como registrar una venta, consultar pedidos o actualizar inventario.
¿Para qué sirven?
- Encapsulan operaciones complejas bajo un nombre claro.
- Reducen tráfico entre aplicación y servidor.
- Favorecen planes de ejecución reutilizables.
- Centralizan validaciones y manejo de errores.
Flujo paso a paso
Definir la intención
Elige una acción concreta: consultar, insertar, actualizar o coordinar una transacción.
Declarar parámetros
Usa parámetros tipados para recibir datos de forma controlada y reutilizable.
Ejecutar y devolver
Invócalo con EXEC; SQL Server procesa el bloque y devuelve el resultado esperado.
Sintaxis básica comentada
-- Crea una operación reutilizable con un parámetro
CREATE PROCEDURE dbo.ObtenerPedidosCliente
@ClienteId INT
AS
BEGIN
SELECT PedidoId, Fecha, Total
FROM dbo.Pedidos
WHERE ClienteId = @ClienteId;
END;
-- Ejecuta el procedimiento cuando se necesita
EXEC dbo.ObtenerPedidosCliente @ClienteId = 12;
Funciones: transformar datos y devolver un resultado
Una función definida por el usuario devuelve un valor escalar o una tabla. A diferencia de un procedimiento, puede utilizarse dentro de expresiones SELECT, WHERE o JOIN cuando su diseño lo permite.
Escalares
Reciben valores y devuelven uno solo: impuestos, descuentos, formatos o cálculos.
En línea con tabla
Devuelven una tabla a partir de una sola consulta; son útiles para filtros reutilizables.
Multisentencia
Construyen una tabla mediante varias instrucciones; úsalas con criterio por su costo potencial.
Procedimiento almacenado
Se ejecuta con EXEC. Puede modificar datos, administrar transacciones y devolver varios resultados.
Función
Devuelve un valor o tabla. Se integra en consultas y se orienta a cálculos o transformación.
Ejemplo: calcular un valor reutilizable
-- Una función escalar devuelve un solo valor
CREATE FUNCTION dbo.CalcularIVA
(@Importe DECIMAL(10,2))
RETURNS DECIMAL(10,2)
AS
BEGIN
RETURN @Importe * 0.16;
END;
SELECT dbo.CalcularIVA(1000) AS IVA;
Triggers: acciones automáticas ante cambios
Un trigger es código que SQL Server ejecuta automáticamente ante eventos como INSERT, UPDATE o DELETE. Resulta útil para auditoría e integridad, pero debe diseñarse con cuidado porque puede ocultar lógica y afectar el rendimiento.
AFTER
Se ejecuta después de que la operación se completa correctamente; es común para auditoría.
INSTEAD OF
Sustituye la acción original y permite controlar operaciones sobre tablas o vistas.
Advertencia clave
Diseña para múltiples filas. No asumas que inserted o deleted contiene solo un registro.
Ejemplo práctico de auditoría
-- Registra cambios después de una actualización
CREATE TRIGGER dbo.trg_AuditarPrecio
ON dbo.Productos
AFTER UPDATE
AS
BEGIN
INSERT INTO dbo.AuditoriaPrecios(ProductoId, FechaCambio)
SELECT ProductoId, SYSDATETIME() FROM inserted;
END;
Por qué estos objetos siguen siendo esenciales
En arquitecturas modernas, la lógica de base de datos bien diseñada aporta consistencia. El objetivo no es poner todo en SQL, sino ubicar cada regla donde aporte más valor y sea más fácil de auditar.
Ejercicios para consolidar lo aprendido
Escribe una propuesta breve antes de consultar la respuesta o probarla en tu entorno de SQL Server.
Procedimiento de consulta
Diseña un procedimiento que reciba @CategoriaId y devuelva los productos activos de esa categoría. ¿Qué columnas mostrarías?
Función de negocio
Propón una función escalar que calcule un descuento según el total de compra. Indica parámetros y tipo de retorno.
Trigger responsable
Describe un trigger AFTER UPDATE para auditar cambios de salario. ¿Qué información guardarías y qué riesgo vigilarías?
Examen de conocimientos
Responde las preguntas de opción múltiple y usa las preguntas cortas para explicar con tus propias palabras.
Cierra la lección: diseña con intención
Los procedimientos organizan acciones; las funciones expresan cálculos reutilizables; los triggers reaccionan a eventos. Elegir correctamente cada objeto mejora la claridad, seguridad y capacidad de mantenimiento de una solución SQL Server.