SQL Dinámico
📘 Introducción
Section titled “📘 Introducción”El SQL dinámico en SQL Server se refiere a la capacidad de construir y ejecutar sentencias SQL como cadenas de texto. Esto permite una gran flexibilidad, ya que las consultas pueden ser generadas o modificadas en tiempo de ejecución, a menudo en respuesta a la entrada del usuario o a condiciones de la aplicación.
Existen dos métodos principales para ejecutar SQL dinámico:
- La instrucción
EXECUTEo simplementeEXEC. - El procedimiento almacenado
sp_executesql.
Recomendación:
Se recomienda encarecidamente la utilización de sp_executesql sobre EXEC por razones de seguridad (evitando la inyección de SQL) y rendimiento (permitiendo la reutilización del plan de ejecución).
⚙️ EXECUTE o EXEC
Section titled “⚙️ EXECUTE o EXEC”La instrucción EXEC permite ejecutar una cadena de texto que contiene una sentencia SQL. La cadena debe ser de tipo NVARCHAR y no acepta parámetros de forma segura, lo que la hace vulnerable a ataques de inyección de SQL.
Ejemplo 1: Consulta SELECT
Section titled “Ejemplo 1: Consulta SELECT”DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT COD_PAIS, NOMBRE_PAIS, ACTIVO, FX_ALTA FROM PAISES'
EXEC (@sql)Ejemplo 2: Sentencia DDL
Section titled “Ejemplo 2: Sentencia DDL”También puedes ejecutar sentencias DDL (Data Definition Language), como CREATE TABLE.
DECLARE @sql nvarchar(1000)
SET @sql = 'CREATE TABLE TEMPORAL (ID int IDENTITY, DATO varchar(100))'
EXEC (@sql)
SET @sql = 'SELECT * FROM TEMPORAL'
EXEC (@sql)🛡️ sp_executesql
Section titled “🛡️ sp_executesql”Este procedimiento almacenado es la forma preferida y más segura de ejecutar SQL dinámico. sp_executesql admite la sustitución de valores de parámetros para cualquier parámetro especificado en la cadena de Transact-SQL a ejecutar. Esto evita la inyección de SQL y mejora el rendimiento al permitir que el motor de la base de datos cachee y reutilice el plan de ejecución de la consulta.
Estructura y Pasos
Section titled “Estructura y Pasos”- Declarar todas las variables que se van a utilizar.
- Definir los parámetros en la variable
@paramDefinitioncon sus respectivos tipos de dato. - Definir las variables de los parámetros (ej.
@importe,@fecha). - Definir la sentencia en la variable de la sentencia (
@sql). - Ejecutar
sp_executesqlpasando la cadena SQL, la definición de parámetros y las variables.
Ejemplo: Uso de Parámetros
Section titled “Ejemplo: Uso de Parámetros”DECLARE @sql nvarchar(1000), @paramDefinition nvarchar(255), @importe decimal(10,2), @fecha datetime
-- Definición de la cadena de parámetrosSET @paramDefinition = '@importe decimal(10,2), @fecha datetime'
-- Definición de los valores de las variablesSET @importe = 1000SET @fecha = '2023-04-20' -- Usar formato estándar y seguro AAAA-MM-DD
-- Sentencia SQL con los parámetrosSET @sql = 'SELECT * FROM Pedidos WHERE importe > @importe AND fecha > @fecha'
EXEC sp_executesql @sql, @paramDefinition, @importe = @importe, @fecha = @fecha