Guía completa de parámetros de procedimientos almacenados en SQL: Uso y mejores prácticas

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.

Índice

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:

  1. Reutilización: Una vez creados, se pueden reutilizar tantas veces como sea necesario.
  2. Rendimiento: Al estar precompilados, la velocidad de ejecución es más rápida.
  3. Seguridad: Al operar a través del procedimiento en lugar de ejecutar directamente las consultas SQL, se reduce el riesgo de inyección SQL.
  4. 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 y DepartamentoID.

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 y SalarioMinimo 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 y NuevoSalario como parámetros de entrada y actualiza el salario del empleado.
  • Si EmpleadoID es menor o igual a 0 o NuevoSalario 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.

Índice