Utiliser une instruction SQL dynamique avec EXEC et sp-execute-sql

Effectué

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 :

  1. Le mot clé EXECUTE ou EXEC.
  2. 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";