Definición y Ventajas:
Ejemplos de Procedimientos Almacenados:
Sin Parámetros:
Mostrar productos con bajo stock:
CREATE PROCEDURE usp_stock
AS
BEGIN
SELECT ProductID, ProductName, UnitsInStock AS Stock
FROM Products
WHERE UnitsInStock < 10
ORDER BY UnitsInStock DESC;
END;
EXEC usp_stock;
Ventas por año:
CREATE PROCEDURE usp_venta_anual
AS
BEGIN
SELECT YEAR(O.OrderDate) AS Año,
CONVERT(DECIMAL(12, 2), SUM(OD.Quantity * OD.UnitPrice * (1 - OD.Discount))) AS Ventas
FROM Orders O
INNER JOIN [Order Details] OD ON O.OrderID = OD.OrderID
GROUP BY YEAR(O.OrderDate);
END;
EXEC usp_venta_anual;
Con Parámetros:
CREATE PROCEDURE usp_ventas_por_categoria (@CategoriaID INT)
AS
BEGIN
SELECT P.ProductName, SUM(OD.Quantity * OD.UnitPrice) AS VentasTotales
FROM [Order Details] OD
INNER JOIN Products P ON OD.ProductID = P.ProductID
WHERE P.CategoryID = @CategoriaID
GROUP BY P.ProductName;
END;
EXEC usp_ventas_por_categoria @CategoriaID = 1;
Creación de Tipos de Datos Personalizados:
CREATE TYPE td_codigo FROM INT;
CREATE TYPE td_nombre FROM VARCHAR(35);
Cálculos Complejos:
Ventas con descuentos en AdventureWorks:
CREATE PROCEDURE psu_ventas_por_año_adw22
AS
BEGIN
SELECT YEAR(SH.OrderDate) AS Año,
CONVERT(DECIMAL(12, 1), SUM(SOD.OrderQty * SOD.UnitPrice *
(1 - IIF(SH.OrderDate >= SO.StartDate AND SH.OrderDate <= SO.EndDate AND SOD.OrderQty >= SO.MinQty AND SOD.OrderQty <= ISNULL(SO.MaxQty, 999999),
SO.DiscountPct, 0)))) AS VentaTotal
FROM Sales.SalesOrderHeader SH
INNER JOIN Sales.SalesOrderDetail SOD ON SH.SalesOrderID = SOD.SalesOrderID
INNER JOIN Sales.SpecialOfferProduct SOP ON SOD.ProductID = SOP.ProductID
INNER JOIN Sales.SpecialOffer SO ON SOP.SpecialOfferID = SO.SpecialOfferID
GROUP BY YEAR(SH.OrderDate);
END;
EXEC psu_ventas_por_año_adw22;