Uso de SQL dinámico con EXEC y sp-execute-sql

Completado

SQL dinámico permite crear una cadena de caracteres que se puede ejecutar como T-SQL como alternativa a los procedimientos almacenados. SQL dinámico es útil cuando no se conocen determinados valores hasta el tiempo de ejecución.

Hay dos maneras de crear SQL dinámico, ya sea mediante:

  1. Palabras clave EXECUTE o EXEC .
  2. El procedimiento almacenado del sistema sp_executesql.

SQL dinámico mediante EXECUTE o EXEC

Para escribir una instrucción SQL dinámica con EXECUTE o EXEC, la sintaxis es:

EXEC (@string_variable);

En el ejemplo siguiente, declaramos una variable denominada @sqlstring de tipo VARCHAR y, a continuación, le asignamos una cadena.

DECLARE @sqlstring AS VARCHAR(1000);
    SET @sqlstring='SELECT customerid, companyname, firstname, lastname 
    FROM SalesLT.Customer;'
EXEC(@sqlstring);
GO

SQL dinámico mediante Sp_executesql

Sp_executesql permite ejecutar una instrucción T-SQL con parámetros. Sp_executesql se pueden usar en lugar de procedimientos almacenados cuando se quiere pasar un valor diferente a la instrucción . La instrucción T-SQL permanece igual y solo cambian los valores de parámetro. Al igual que los procedimientos almacenados, es probable que el optimizador de consultas de SQL Server reutilice el plan de ejecución.

Sp_executesql toma una instrucción T-SQL como argumento, que puede ser una constante Unicode o una variable Unicode. Por ejemplo, ambos ejemplos de código son válidos:

DECLARE @sqlstring1 NVARCHAR(1000);
SET @SqlString1 =
    N'SELECT TOP(10) name, listprice
    FROM SalesLT.Product
    GROUP BY name, listprice
    ORDER BY listprice DESC;'
EXECUTE sp_executesql @SqlString1;

OR

EXECUTE sp_executesql N'SELECT TOP(10) name, listprice
    FROM SalesLT.Product
    GROUP BY name, listprice
    ORDER BY listprice DESC;'

En este ejemplo, se pasa un parámetro a la instrucción T-SQL:

EXECUTE sp_executesql   
          N'SELECT * FROM SalesLT.Customer   
          WHERE CompanyName = @company',  
          N'@company nvarchar(128)',  
          @company = "Sharp Bikes";