Utiliser une instruction SQL dynamique avec EXEC et sp-execute-sql
SQL dynamique vous permet de créer une chaîne de caractères qui peut être exécutée en tant que T-SQL comme alternative aux procédures stockées. SQL dynamique est utile lorsque vous ne connaissez pas certaines valeurs jusqu’à l’heure d’exécution.
Il existe deux façons de créer des SQL dynamiques, en utilisant :
- Le mot clé EXECUTE ou EXEC.
- La procédure stockée système sp_executesql.
Instruction SQL dynamique avec EXECUTE ou EXEC
Pour écrire une instruction SQL dynamique avec EXECUTE ou EXEC, la syntaxe est :
EXEC (@string_variable);
Dans l'exemple suivant, nous déclarons une variable appelée @sqlstring de type VARCHAR, puis nous lui attribuons une chaîne de caractères.
DECLARE @sqlstring AS VARCHAR(1000);
SET @sqlstring='SELECT customerid, companyname, firstname, lastname
FROM SalesLT.Customer;'
EXEC(@sqlstring);
GO
Instruction SQL dynamique avec Sp_executesql
Sp_executesql vous permet d'exécuter une instruction T-SQL avec des paramètres. Sp_executesql peut être utilisé à la place des procédures stockées lorsque vous souhaitez passer une valeur différente à l'instruction. L'instruction T-SQL reste la même, seules les valeurs des paramètres changent. Comme pour les procédures stockées, l’optimiseur de requête SQL Server est susceptible de réutiliser le plan d'exécution.
Sp_executesql prend comme argument une instruction T-SQL, qui peut être une constante Unicode ou une variable Unicode. Par exemple, ces deux exemples de code sont valides :
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;'
Dans cet exemple, un paramètre est passé à l'instruction T-SQL :
EXECUTE sp_executesql
N'SELECT * FROM SalesLT.Customer
WHERE CompanyName = @company',
N'@company nvarchar(128)',
@company = "Sharp Bikes";