El uso de parámetros en los procedimientos almacenados de SQL permite una manipulación de datos eficiente y flexible. Los procedimientos almacenados son herramientas poderosas que simplifican las operaciones complejas dentro de una base de datos, mejoran la reutilización y facilitan el mantenimiento. En este artículo, exploraremos en detalle los tipos de parámetros, cómo declararlos, ejemplos prácticos, manejo de errores y todo lo relacionado con los parámetros en procedimientos almacenados.
Fundamentos de los procedimientos almacenados
Un procedimiento almacenado es un conjunto de instrucciones SQL que se ejecutan dentro de una base de datos y se pueden invocar de manera similar a una función. Esto permite procesar consultas complejas y tareas repetitivas de manera eficiente, mejorando la reutilización y el mantenimiento. Los procedimientos almacenados también contribuyen a la optimización del rendimiento y al fortalecimiento de la seguridad.
Ventajas de los procedimientos almacenados
Las principales ventajas de utilizar procedimientos almacenados son:
- Reutilización: Una vez creados, se pueden reutilizar tantas veces como sea necesario.
- Rendimiento: Al estar precompilados, la velocidad de ejecución es más rápida.
- Seguridad: Al operar a través del procedimiento en lugar de ejecutar directamente las consultas SQL, se reduce el riesgo de inyección SQL.
- Mantenimiento: Concentrar la lógica en un solo lugar facilita el mantenimiento.
Sintaxis básica de los procedimientos almacenados
A continuación, se presenta la sintaxis básica de un procedimiento almacenado en SQL Server:
CREATE PROCEDURE NombreProcedimiento
AS
BEGIN
-- Escribir las instrucciones SQL aquí
END;
Como ejemplo específico, creemos un procedimiento almacenado simple que recupere datos de la tabla de empleados.
CREATE PROCEDURE ObtenerEmpleados
AS
BEGIN
SELECT * FROM Empleados;
END;
Este procedimiento almacenado recuperará todos los registros de la tabla de empleados cuando se ejecute.
Tipos y características de los parámetros
Los procedimientos almacenados pueden utilizar múltiples parámetros para permitir una manipulación de datos flexible. Hay tres tipos de parámetros: de entrada, de salida y de entrada/salida. Veamos en detalle las características y usos de cada uno.
Parámetros de entrada
Los parámetros de entrada se utilizan para pasar valores al procedimiento almacenado. Reciben valores del llamante y procesan en función de esos valores. Se declaran utilizando la palabra clave IN
.
Ejemplo:
CREATE PROCEDURE ObtenerEmpleadoPorID
@EmpleadoID INT
AS
BEGIN
SELECT * FROM Empleados WHERE EmpleadoID = @EmpleadoID;
END;
En este ejemplo, se utiliza el parámetro de entrada @EmpleadoID
para recuperar información de un empleado específico.
Parámetros de salida
Los parámetros de salida se utilizan para devolver los resultados de la ejecución del procedimiento almacenado al llamante. Se declaran utilizando la palabra clave OUT
.
Ejemplo:
CREATE PROCEDURE ObtenerCantidadEmpleados
@CantidadEmpleados INT OUTPUT
AS
BEGIN
SELECT @CantidadEmpleados = COUNT(*) FROM Empleados;
END;
En este ejemplo, se utiliza el parámetro de salida @CantidadEmpleados
para obtener la cantidad de empleados y devolverla al llamante.
Parámetros de entrada/salida
Los parámetros de entrada/salida se utilizan para pasar valores al procedimiento almacenado y devolver los valores actualizados después del procesamiento. Se declaran utilizando la palabra clave INOUT
.
Ejemplo:
CREATE PROCEDURE ActualizarSalarioEmpleado
@EmpleadoID INT,
@NuevoSalario DECIMAL(10, 2) OUTPUT
AS
BEGIN
UPDATE Empleados SET Salario = @NuevoSalario WHERE EmpleadoID = @EmpleadoID;
SELECT @NuevoSalario = Salario FROM Empleados WHERE EmpleadoID = @EmpleadoID;
END;
En este ejemplo, se utiliza el parámetro de entrada/salida @NuevoSalario
para actualizar el salario de un empleado y devolver el salario actualizado.
Declaración y uso de parámetros
Explicaremos cómo declarar y utilizar parámetros en un procedimiento almacenado con ejemplos específicos. La correcta declaración y uso de los parámetros aumenta considerablemente la flexibilidad y la reutilización de los procedimientos almacenados.
Declaración de parámetros
Al declarar un parámetro en un procedimiento almacenado, se debe especificar el nombre del parámetro, el tipo de datos y, si es necesario, la dirección (entrada, salida, entrada/salida).
Sintaxis básica:
CREATE PROCEDURE NombreProcedimiento
@NombreParametro TipoDeDato [IN | OUT | INOUT]
AS
BEGIN
-- Escribir las instrucciones SQL aquí
END;
Ejemplo:
CREATE PROCEDURE ObtenerEmpleadoPorNombre
@NombreEmpleado NVARCHAR(50)
AS
BEGIN
SELECT * FROM Empleados WHERE Nombre = @NombreEmpleado;
END;
En este ejemplo, se declara el parámetro @NombreEmpleado
para buscar datos por el nombre del empleado.
Uso de parámetros
Los parámetros declarados se pueden utilizar dentro del procedimiento almacenado como variables normales. Se asignan valores a los parámetros y se ejecutan las instrucciones SQL basadas en esos valores.
Ejemplo:
CREATE PROCEDURE ActualizarDepartamentoEmpleado
@EmpleadoID INT,
@NuevoDepartamentoID INT
AS
BEGIN
UPDATE Empleados SET DepartamentoID = @NuevoDepartamentoID WHERE EmpleadoID = @EmpleadoID;
END;
En este procedimiento almacenado, se utilizan dos parámetros de entrada @EmpleadoID
y @NuevoDepartamentoID
para actualizar el departamento de un empleado.
Ejemplo de uso de parámetros: Inserción de datos
A continuación, se muestra un ejemplo de cómo usar parámetros para insertar datos.
Ejemplo:
CREATE PROCEDURE AgregarNuevoEmpleado
@NombreEmpleado NVARCHAR(50),
@FechaContratacion DATE,
@DepartamentoID INT
AS
BEGIN
INSERT INTO Empleados (Nombre, FechaContratacion, DepartamentoID)
VALUES (@NombreEmpleado, @FechaContratacion, @DepartamentoID);
END;
Este procedimiento almacenado inserta la información de un nuevo empleado en la tabla Empleados.
Tipos de datos de los parámetros
Los parámetros en los procedimientos almacenados pueden utilizar una variedad de tipos de datos, y la selección de un tipo de datos adecuado permite una manipulación de datos eficiente y precisa. Aquí se explica los principales tipos de datos y cómo elegirlos.
Tipos de datos básicos
A continuación se presentan los tipos de datos básicos que se utilizan con frecuencia en los procedimientos almacenados.
- INT: Almacena valores enteros. Ejemplo: edad, ID.
- DECIMAL: Almacena valores numéricos con punto decimal. Ejemplo: precios, salarios.
- NVARCHAR: Almacena cadenas de texto de longitud variable. Ejemplo: nombres, direcciones.
- DATE: Almacena fechas. Ejemplo: fechas de nacimiento, fechas de contratación.
Cómo elegir el tipo de datos
Al elegir el tipo de datos de un parámetro, se deben considerar los siguientes puntos.
Naturaleza de los datos
Seleccione el tipo de datos adecuado según la naturaleza de los datos. Por ejemplo, use INT
para cantidades o contadores, DECIMAL
para precios o porcentajes, y NVARCHAR
para información de texto.
Eficiencia del almacenamiento
La elección del tipo de datos también afecta la eficiencia del almacenamiento. Seleccionar un tamaño de tipo de datos adecuado puede minimizar el uso de almacenamiento. Por ejemplo, para cadenas de texto cortas, especifique una longitud adecuada como NVARCHAR(50)
.
Precisión de los datos
Para datos numéricos, elija el tipo de datos considerando la precisión y escala necesarias. Por ejemplo, especifique DECIMAL(10, 2)
para manejar cantidades monetarias con precisión hasta dos decimales.
Ejemplo práctico: Elección del tipo de datos de parámetros
El siguiente ejemplo muestra cómo elegir el tipo de datos adecuado en un procedimiento almacenado para gestionar la información de empleados.
CREATE PROCEDURE AgregarEmpleado
@NombreEmpleado NVARCHAR(100),
@FechaNacimiento DATE,
@Salario DECIMAL(10, 2),
@DepartamentoID INT
AS
BEGIN
INSERT INTO Empleados (Nombre, FechaNacimiento, Salario, DepartamentoID)
VALUES (@NombreEmpleado, @FechaNacimiento, @Salario, @DepartamentoID);
END;
En este ejemplo, se utiliza NVARCHAR(100)
para el nombre del empleado, DATE
para la fecha de nacimiento, DECIMAL(10, 2)
para el salario y INT
para el ID del departamento.
Uso de parámetros para la bifurcación de condiciones
El uso de parámetros en un procedimiento almacenado permite realizar bifurcaciones de condiciones, lo que permite crear consultas más flexibles y potentes. Aquí se explica cómo manejar la bifurcación de condiciones con ejemplos prácticos.
Bifurcación básica de condiciones
Puede usar la instrucción IF
para ejecutar diferentes procesos según los valores de los parámetros.
Ejemplo:
CREATE PROCEDURE ObtenerDetallesEmpleado
@EmpleadoID INT,
@IncluirSalario BIT
AS
BEGIN
IF @IncluirSalario = 1
BEGIN
SELECT Nombre, FechaNacimiento, Salario FROM Empleados WHERE EmpleadoID = @EmpleadoID;
END
ELSE
BEGIN
SELECT Nombre, FechaNacimiento FROM Empleados WHERE EmpleadoID = @EmpleadoID;
END
END;
En este procedimiento almacenado, se bifurca según el valor del parámetro @IncluirSalario
para incluir o no la información salarial.
Bifurcación de condiciones complejas
Puede combinar múltiples condiciones para implementar una lógica más compleja.
Ejemplo:
CREATE PROCEDURE FiltrarEmpleados
@DepartamentoID INT = NULL,
@SalarioMinimo DECIMAL(10, 2) = NULL,
@SalarioMaximo DECIMAL(10, 2) = NULL
AS
BEGIN
SELECT * FROM Empleados
WHERE (@DepartamentoID IS NULL OR DepartamentoID = @DepartamentoID)
AND (@SalarioMinimo IS NULL OR Salario >= @SalarioMinimo)
AND (@SalarioMaximo IS NULL OR Salario <= @SalarioMaximo);
END;
En este ejemplo, se filtran los empleados según los parámetros @DepartamentoID
, @SalarioMinimo
y @SalarioMaximo
. Si los parámetros son NULL
, se ignoran esas condiciones.
Ejemplo práctico: Actualización de datos con bifurcación de condiciones
A continuación se muestra un ejemplo de cómo usar parámetros para realizar bifurcaciones de condiciones al actualizar datos de empleados.
Ejemplo:
CREATE PROCEDURE ActualizarInfoEmpleado
@EmpleadoID INT,
@NuevoNombre NVARCHAR(100) = NULL,
@NuevoDepartamentoID INT = NULL,
@NuevoSalario DECIMAL(10, 2) = NULL
AS
BEGIN
IF @NuevoNombre IS NOT NULL
BEGIN
UPDATE Empleados SET Nombre = @NuevoNombre WHERE EmpleadoID = @EmpleadoID;
END
IF @NuevoDepartamentoID IS NOT NULL
BEGIN
UPDATE Empleados SET DepartamentoID = @NuevoDepartamentoID WHERE EmpleadoID = @EmpleadoID;
END
IF @NuevoSalario IS NOT NULL
BEGIN
UPDATE Empleados SET Salario = @NuevoSalario WHERE EmpleadoID = @EmpleadoID;
END
END;
En este procedimiento almacenado, se actualiza la información del empleado según los valores de los parámetros @NuevoNombre
, @NuevoDepartamentoID
y @NuevoSalario
. Solo se actualizan los campos correspondientes si los parámetros no son NULL
.
Uso de múltiples parámetros
El uso de múltiples parámetros en un procedimiento almacenado permite ejecutar consultas más flexibles y complejas. A continuación, se explica cómo utilizar múltiples parámetros de manera adecuada y se brindan algunas mejores prácticas.
Fundamentos del uso de múltiples parámetros
Para agregar múltiples parámetros a un procedimiento almacenado, simplemente declárelos separados por comas.
Sintaxis básica:
CREATE PROCEDURE NombreProcedimiento
@Parametro1 TipoDeDato,
@Parametro2 TipoDeDato,
...
AS
BEGIN
-- Escribir las instrucciones SQL aquí
END;
Ejemplo:
CREATE PROCEDURE ObtenerInfoEmpleado
@EmpleadoID INT,
@DepartamentoID INT
AS
BEGIN
SELECT * FROM Empleados WHERE EmpleadoID = @EmpleadoID AND DepartamentoID = @DepartamentoID;
END;
En este ejemplo, se utilizan dos parámetros @EmpleadoID
y @DepartamentoID
para recuperar la información de un empleado específico.
Valores predeterminados de parámetros
Establecer valores predeterminados para los parámetros permite omitir valores al llamar al procedimiento.
Ejemplo:
CREATE PROCEDURE ObtenerEmpleadosPorDepartamento
@DepartamentoID INT = NULL
AS
BEGIN
IF @DepartamentoID IS NULL
BEGIN
SELECT * FROM Empleados;
END
ELSE
BEGIN
SELECT * FROM Empleados WHERE DepartamentoID = @DepartamentoID;
END
END;
En este procedimiento almacenado, si no se especifica @DepartamentoID
, se recuperan todos los empleados; si se especifica, se recuperan solo los empleados de un departamento específico.
Orden y especificación de parámetros
Al llamar a un procedimiento almacenado, es importante prestar atención al orden de los parámetros. Sin embargo, especificar el nombre del parámetro permite una llamada independiente del orden.
Ejemplo:
EXEC ObtenerInfoEmpleado @EmpleadoID = 1, @DepartamentoID = 2;
En esta llamada, se especifican los nombres de los parámetros para pasar los valores correctamente sin depender del orden.
Ejemplo práctico: Inserción de datos utilizando múltiples parámetros
A continuación se muestra un ejemplo de cómo usar múltiples parámetros para insertar información de un nuevo empleado.
Ejemplo:
CREATE PROCEDURE AgregarEmpleado
@NombreEmpleado NVARCHAR(100),
@FechaNacimiento DATE,
@Salario DECIMAL(10, 2),
@DepartamentoID INT
AS
BEGIN
INSERT INTO Empleados (Nombre, FechaNacimiento, Salario, DepartamentoID)
VALUES (@NombreEmpleado, @FechaNacimiento, @Salario, @DepartamentoID);
END;
En este procedimiento almacenado, se utilizan cuatro parámetros @NombreEmpleado
, @FechaNacimiento
, @Salario
y @DepartamentoID
para insertar la información de un nuevo empleado.
Ejemplo práctico: Generación de SQL dinámico
El uso de parámetros para generar SQL dinámico permite crear consultas flexibles y genéricas. Sin embargo, es importante tomar precauciones para evitar el riesgo de inyección SQL, utilizando consultas parametrizadas.
Sintaxis básica del SQL dinámico
Para usar SQL dinámico, se utiliza EXEC
o sp_executesql
para ejecutar instrucciones SQL. Especialmente, sp_executesql
permite ejecutar consultas parametrizadas, mejorando la seguridad.
Ejemplo:
CREATE PROCEDURE BuscarEmpleados
@TerminoBusqueda NVARCHAR(100)
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'SELECT * FROM Empleados WHERE Nombre LIKE @Termino'
EXEC sp_executesql @SQL, N'@Termino NVARCHAR(100)', @Termino = '%' + @TerminoBusqueda + '%'
END;
En este procedimiento almacenado, se utiliza el parámetro @TerminoBusqueda
para buscar registros que coincidan parcialmente con el nombre del empleado.
Ventajas y consideraciones del SQL dinámico
Las ventajas de usar SQL dinámico son las siguientes:
- Flexibilidad: Permite cambiar la consulta de manera dinámica en tiempo de ejecución.
- Reutilización: Permite reutilizar la misma consulta base con diferentes condiciones.
Consideraciones:
- Riesgo de inyección SQL: Usar entradas de usuario directamente en SQL dinámico puede aumentar el riesgo de inyección SQL, por lo que es crucial usar consultas parametrizadas.
- Rendimiento: El SQL dinámico puede tener un rendimiento inferior en comparación con SQL estático.
Ejemplo práctico: Generación de SQL dinámico con múltiples condiciones
A continuación se muestra un ejemplo de cómo usar múltiples parámetros para generar SQL dinámico basado en múltiples condiciones.
Ejemplo:
CREATE PROCEDURE FiltrarEmpleados
@Nombre NVARCHAR(100) = NULL,
@SalarioMinimo DECIMAL(10, 2) = NULL,
@SalarioMaximo DECIMAL(10, 2) = NULL
AS
BEGIN
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'SELECT * FROM Empleados WHERE 1=1'
IF @Nombre IS NOT NULL
BEGIN
SET @SQL = @SQL + ' AND Nombre LIKE @Nombre'
END
IF @SalarioMinimo IS NOT NULL
BEGIN
SET @SQL = @SQL + ' AND Salario >= @SalarioMinimo'
END
IF @SalarioMaximo IS NOT NULL
BEGIN
SET @SQL = @SQL + ' AND Salario <= @SalarioMaximo'
END
EXEC sp_executesql @SQL,
N'@Nombre NVARCHAR(100), @SalarioMinimo DECIMAL(10, 2), @SalarioMaximo DECIMAL(10, 2)',
@Nombre = '%' + @Nombre + '%',
@SalarioMinimo = @SalarioMinimo,
@SalarioMaximo = @SalarioMaximo
END;
En este procedimiento almacenado, se filtran los empleados según los parámetros @Nombre
, @SalarioMinimo
y @SalarioMaximo
. Cada condición se agrega de manera dinámica.
Validación de parámetros y manejo de errores
Al utilizar parámetros en un procedimiento almacenado, es fundamental validar los valores de los parámetros y manejar los errores de manera adecuada. Esto asegura la consistencia y confiabilidad de los datos.
Validación de parámetros
Validar los valores de los parámetros dentro del procedimiento almacenado puede prevenir datos incorrectos y errores inesperados.
Ejemplo:
CREATE PROCEDURE ActualizarSalarioEmpleado
@EmpleadoID INT,
@NuevoSalario DECIMAL(10, 2)
AS
BEGIN
-- Validación de parámetros
IF @EmpleadoID <= 0
BEGIN
RAISERROR('El ID de empleado debe ser mayor que 0', 16, 1)
RETURN
END
IF @NuevoSalario < 0
BEGIN
RAISERROR('El salario no puede ser negativo', 16, 1)
RETURN
END
-- Proceso de actualización
UPDATE Empleados SET Salario = @NuevoSalario WHERE EmpleadoID = @EmpleadoID;
END;
En este procedimiento almacenado, se valida que @EmpleadoID
sea un número entero positivo y que @NuevoSalario
no sea un valor negativo. Si no se cumplen las condiciones, se genera un error y se interrumpe el proceso.
Manejo de errores
Es importante manejar adecuadamente los posibles errores dentro de un procedimiento almacenado. Una forma común de hacerlo es utilizando un bloque TRY...CATCH
.
Ejemplo:
CREATE PROCEDURE TransferirEmpleado
@EmpleadoID INT,
@NuevoDepartamentoID INT
AS
BEGIN
BEGIN TRY
-- Inicio de la transacción
BEGIN TRANSACTION
-- Actualización del departamento
UPDATE Empleados SET DepartamentoID = @NuevoDepartamentoID WHERE EmpleadoID = @EmpleadoID;
-- Confirmar la transacción
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Revertir la transacción
ROLLBACK TRANSACTION
-- Obtener el mensaje de error
DECLARE @MensajeError NVARCHAR(4000)
SELECT @MensajeError = ERROR_MESSAGE()
-- Generar el error
RAISERROR(@MensajeError, 16, 1)
END CATCH
END;
En este procedimiento almacenado, se actualiza el departamento dentro de una transacción, y si ocurre un error, se revierte la transacción y se muestra el mensaje de error.
Ejemplo práctico: Combinación de validación de parámetros y manejo de errores
El siguiente ejemplo muestra cómo combinar la validación de parámetros y el manejo de errores para crear un procedimiento almacenado más robusto.
Ejemplo:
CREATE PROCEDURE PromoverEmpleado
@EmpleadoID INT,
@NuevoTitulo NVARCHAR(100),
@NuevoSalario DECIMAL(10, 2)
AS
BEGIN
BEGIN TRY
-- Validación de parámetros
IF @EmpleadoID <= 0
BEGIN
RAISERROR('El ID de empleado debe ser mayor que 0', 16, 1)
RETURN
END
IF @NuevoSalario < 0
BEGIN
RAISERROR('El salario no puede ser negativo', 16, 1)
RETURN
END
-- Inicio de la transacción
BEGIN TRANSACTION
-- Promoción del empleado
UPDATE Empleados SET Titulo = @NuevoTitulo, Salario = @NuevoSalario WHERE EmpleadoID = @EmpleadoID;
-- Confirmar la transacción
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Revertir la transacción
ROLLBACK TRANSACTION
-- Obtener el mensaje de error
DECLARE @MensajeError NVARCHAR(4000)
SELECT @MensajeError = ERROR_MESSAGE()
-- Generar el error
RAISERROR(@MensajeError, 16, 1)
END CATCH
END;
En este procedimiento almacenado, se valida el ID del empleado y el nuevo salario, y se realiza el proceso de promoción dentro de una transacción. Si ocurre un error, se revierte la transacción y se muestra el mensaje de error.
Ejemplo avanzado: Procesamiento por lotes con procedimientos almacenados
Los procedimientos almacenados son herramientas poderosas para realizar procesamiento por lotes de manera eficiente. Al manejar grandes volúmenes de datos, el uso de procedimientos almacenados permite mejorar el rendimiento y reutilizar código.
Conceptos básicos del procesamiento por lotes
El procesamiento por lotes se refiere a la ejecución de operaciones de inserción, actualización, eliminación, etc., en grandes volúmenes de datos de manera simultánea. Esto permite manejar datos de manera más eficiente que el procesamiento individual.
Ventajas del procesamiento por lotes
- Mejora del rendimiento: Al procesar grandes volúmenes de datos de una sola vez, es más rápido que el procesamiento individual.
- Consistencia: Es posible mantener la consistencia utilizando transacciones.
- Reutilización: Al poder ejecutar el mismo proceso varias veces, se aumenta la reutilización del código.
Ejemplo de procesamiento por lotes: Actualización de salarios de empleados
El siguiente procedimiento almacenado actualiza los salarios de los empleados en función de condiciones específicas.
Ejemplo:
CREATE PROCEDURE ActualizarSalariosPorLote
@DepartamentoID INT,
@IncrementoSalarial DECIMAL(10, 2)
AS
BEGIN
BEGIN TRY
-- Inicio de la transacción
BEGIN TRANSACTION
-- Actualizar salarios de empleados en el departamento especificado
UPDATE Empleados
SET Salario = Salario + @IncrementoSalarial
WHERE DepartamentoID = @DepartamentoID;
-- Confirmar la transacción
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Revertir la transacción
ROLLBACK TRANSACTION
-- Obtener el mensaje de error
DECLARE @MensajeError NVARCHAR(4000)
SELECT @MensajeError = ERROR_MESSAGE()
-- Generar el error
RAISERROR(@MensajeError, 16, 1)
END CATCH
END;
Este procedimiento almacenado actualiza los salarios de todos los empleados de un departamento específico de manera simultánea. Se utiliza una transacción para mantener la consistencia, y si ocurre un error, se revierte la transacción.
Ejemplo de procesamiento por lotes: Inserción masiva de datos
El siguiente procedimiento almacenado inserta un gran número de registros en bloque a partir de otra tabla.
Ejemplo:
CREATE PROCEDURE InsertarNuevosEmpleadosPorLote
AS
BEGIN
BEGIN TRY
-- Inicio de la transacción
BEGIN TRANSACTION
-- Inserción masiva de datos de nuevos empleados
INSERT INTO Empleados (Nombre, FechaNacimiento, Salario, DepartamentoID)
SELECT Nombre, FechaNacimiento, Salario, DepartamentoID
FROM NuevosEmpleados;
-- Confirmar la transacción
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Revertir la transacción
ROLLBACK TRANSACTION
-- Obtener el mensaje de error
DECLARE @MensajeError NVARCHAR(4000)
SELECT @MensajeError = ERROR_MESSAGE()
-- Generar el error
RAISERROR(@MensajeError, 16, 1)
END CATCH
END;
En este procedimiento almacenado, se carga datos desde la tabla NuevosEmpleados
y se insertan en bloque en la tabla Empleados
. Se utiliza una transacción para asegurar la consistencia y revertir en caso de error.
Ejercicios
Proporcionamos ejercicios para profundizar en el aprendizaje y mejorar las habilidades prácticas. A través de estos ejercicios, podrás comprender mejor cómo utilizar parámetros en procedimientos almacenados y aplicar ejemplos avanzados de procesamiento por lotes.
Ejercicio 1: Creación de un procedimiento almacenado básico
Crea un procedimiento almacenado básico según los siguientes requisitos.
- Recibe
EmpleadoID
como parámetro de entrada y recupera los detalles de ese empleado. - La información del empleado incluye
Nombre
,FechaNacimiento
yDepartamentoID
.
Ejemplo de respuesta
CREATE PROCEDURE ObtenerDetallesEmpleado
@EmpleadoID INT
AS
BEGIN
SELECT Nombre, FechaNacimiento, DepartamentoID
FROM Empleados
WHERE EmpleadoID = @EmpleadoID;
END;
Ejercicio 2: Creación de un procedimiento almacenado con bifurcación de condiciones
Crea un procedimiento almacenado con bifurcación de condiciones según los siguientes requisitos.
- Recibe
DepartamentoID
ySalarioMinimo
como parámetros de entrada y filtra a los empleados según las condiciones especificadas. - Si
DepartamentoID
es NULL, busca en todos los empleados. - Si
SalarioMinimo
es NULL, no aplica la condición salarial.
Ejemplo de respuesta
CREATE PROCEDURE FiltrarEmpleados
@DepartamentoID INT = NULL,
@SalarioMinimo DECIMAL(10, 2) = NULL
AS
BEGIN
SELECT * FROM Empleados
WHERE (@DepartamentoID IS NULL OR DepartamentoID = @DepartamentoID)
AND (@SalarioMinimo IS NULL OR Salario >= @SalarioMinimo);
END;
Ejercicio 3: Creación de un procedimiento almacenado con manejo de errores
Crea un procedimiento almacenado con manejo de errores según los siguientes requisitos.
- Recibe
EmpleadoID
yNuevoSalario
como parámetros de entrada y actualiza el salario del empleado. - Si
EmpleadoID
es menor o igual a 0 oNuevoSalario
es un valor negativo, genera un error. - Utiliza una transacción para mantener la consistencia.
Ejemplo de respuesta
CREATE PROCEDURE ActualizarSalarioEmpleado
@EmpleadoID INT,
@NuevoSalario DECIMAL(10, 2)
AS
BEGIN
BEGIN TRY
-- Validación de parámetros
IF @EmpleadoID <= 0
BEGIN
RAISERROR('El ID de empleado debe ser mayor que 0', 16, 1)
RETURN
END
IF @NuevoSalario < 0
BEGIN
RAISERROR('El salario no puede ser negativo', 16, 1)
RETURN
END
-- Inicio de la transacción
BEGIN TRANSACTION
-- Actualización del salario del empleado
UPDATE Empleados SET Salario = @NuevoSalario WHERE EmpleadoID = @EmpleadoID;
-- Confirmar la transacción
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- Revertir la transacción
ROLLBACK TRANSACTION
-- Obtener el mensaje de error
DECLARE @MensajeError NVARCHAR(4000)
SELECT @MensajeError = ERROR_MESSAGE()
-- Generar el error
RAISERROR(@MensajeError, 16, 1)
END CATCH
END;
Conclusión
El uso de parámetros en los procedimientos almacenados de SQL mejora considerablemente la eficiencia y la flexibilidad en la manipulación de datos. En este artículo, hemos cubierto desde los fundamentos hasta ejemplos avanzados de tipos de parámetros, cómo declararlos, manejo de errores, y ejemplos de procesamiento por lotes. Aprovechando estos conocimientos, podrás realizar operaciones más complejas y de alto rendimiento en bases de datos. El uso adecuado de parámetros permite crear código SQL seguro y fácil de mantener.