Procedimientos almacenados: encapsular una operación con parámetros
Cuando una consulta debe ejecutarse desde varias aplicaciones o necesita combinar validaciones, lecturas y modificaciones, un procedimiento permite darle un nombre y una interfaz estable.
Un procedimiento puede recibir parámetros, ejecutar varias instrucciones y devolver uno o más conjuntos de resultados. No es solamente una consulta guardada: también puede coordinar una operación completa.
Crear o actualizar el procedimiento
CREATE OR ALTER PROCEDURE dbo.usp_ProductosPorCategoria
@IdCategoria SMALLINT,
@SoloActivos BIT = 1
AS
BEGIN
SET NOCOUNT ON;
SELECT
p.IdProducto,
p.Nombre,
p.Precio,
p.Existencia
FROM dbo.Producto AS p
WHERE p.IdCategoria = @IdCategoria
AND (@SoloActivos = 0 OR p.Activo = 1)
ORDER BY p.Nombre;
END;
GO
CREATE OR ALTER permite utilizar el mismo script tanto al crear como al modificar el objeto. La instrucción debe iniciar su lote; GO es el separador que emplea la herramienta cliente.
El parámetro @SoloActivos tiene un valor predeterminado. Quien llama puede omitirlo o enviar otro valor de forma explícita.
Ejecutarlo
EXEC dbo.usp_ProductosPorCategoria
@IdCategoria = 2;
EXEC dbo.usp_ProductosPorCategoria
@IdCategoria = 2,
@SoloActivos = 0;
Nombrar los parámetros hace la llamada más legible y menos dependiente de su posición.
Parámetros de salida
Un parámetro OUTPUT permite devolver un valor puntual además de los conjuntos de filas:
CREATE OR ALTER PROCEDURE dbo.usp_ContarProductosActivos
@IdCategoria SMALLINT,
@Cantidad INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @Cantidad = COUNT(*)
FROM dbo.Producto
WHERE IdCategoria = @IdCategoria
AND Activo = 1;
END;
GO
DECLARE @Total INT;
EXEC dbo.usp_ContarProductosActivos
@IdCategoria = 2,
@Cantidad = @Total OUTPUT;
SELECT @Total AS ProductosActivos;
La palabra OUTPUT se declara en el procedimiento y se repite en la llamada. Si falta en la llamada, la variable exterior no recibe el valor.
Resultado, salida y retorno
Un SELECT devuelve filas. Un parámetro OUTPUT devuelve un valor mediante la interfaz del procedimiento. RETURN devuelve un entero que suele reservarse para un estado de ejecución, no para transportar datos de negocio.
La aplicación que consume el procedimiento debe conocer qué conjuntos y parámetros espera. Cambiar nombres, tipos u orden de columnas puede romper consumidores aunque el procedimiento siga compilando.
Qué conviene comprobar
Validamos tipos, valores predeterminados, permisos y comportamiento ante errores. También evitamos construir SQL dinámico concatenando texto recibido; cuando sea imprescindible, parametrizamos la ejecución.
Los filtros opcionales pueden producir planes adecuados para unos valores y pobres para otros. Medimos con datos representativos antes de aplicar soluciones como recompilación o SQL dinámico.
Relacionado con
- Variables: reciben parámetros y resultados puntuales.
TRY/CATCH: controla errores dentro de una operación.- Transacciones: agrupan modificaciones que deben confirmarse juntas.
- Funciones: devuelven un valor o un conjunto y tienen restricciones diferentes.