Uso de SQL dinámico con EXEC y sp-execute-sql
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:
- Palabras clave EXECUTE o EXEC .
- 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";