Skip to content

SQL Dinámico

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:

  1. La instrucción EXECUTE o simplemente EXEC.
  2. 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).


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.

DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT COD_PAIS, NOMBRE_PAIS, ACTIVO, FX_ALTA FROM PAISES'
EXEC (@sql)

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)

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.

  1. Declarar todas las variables que se van a utilizar.
  2. Definir los parámetros en la variable @paramDefinition con sus respectivos tipos de dato.
  3. Definir las variables de los parámetros (ej. @importe, @fecha).
  4. Definir la sentencia en la variable de la sentencia (@sql).
  5. Ejecutar sp_executesql pasando la cadena SQL, la definición de parámetros y las variables.
DECLARE @sql nvarchar(1000),
@paramDefinition nvarchar(255),
@importe decimal(10,2),
@fecha datetime
-- Definición de la cadena de parámetros
SET @paramDefinition = '@importe decimal(10,2), @fecha datetime'
-- Definición de los valores de las variables
SET @importe = 1000
SET @fecha = '2023-04-20' -- Usar formato estándar y seguro AAAA-MM-DD
-- Sentencia SQL con los parámetros
SET @sql = 'SELECT *
FROM Pedidos
WHERE importe > @importe
AND fecha > @fecha'
EXEC sp_executesql @sql, @paramDefinition, @importe = @importe, @fecha = @fecha