Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Déclarer une variable pour une chaîne de requête

C'est possible, mais cela nécessite l'utilisation de SQL dynamique.
Je recommande de lire La malédiction et les bénédictions du dynamique SQL avant de continuer...

DECLARE @theDate varchar(60)
SET @theDate = '''2010-01-01'' AND ''2010-08-31 23:59:59'''

DECLARE @SQL VARCHAR(MAX)  
SET @SQL = 'SELECT AdministratorCode, 
                   SUM(Total) as theTotal, 
                   SUM(WOD.Quantity) as theQty, 
                   AVG(Total) as avgTotal, 
                  (SELECT SUM(tblWOD.Amount)
                     FROM tblWOD
                     JOIN tblWO on tblWOD.OrderID = tblWO.ID
                    WHERE tblWO.Approved = ''1''
                      AND tblWO.AdministratorCode = tblWO.AdministratorCode
                      AND tblWO.OrderDate BETWEEN '+ @theDate +')'

EXEC(@SQL)

Dynamic SQL est juste une instruction SQL, composée sous forme de chaîne avant d'être exécutée. Ainsi, la concaténation de chaînes habituelle se produit. Le SQL dynamique est requis chaque fois que vous voulez faire quelque chose dans la syntaxe SQL qui n'est pas autorisé, comme :

  • un seul paramètre pour représenter une liste de valeurs séparées par des virgules pour une clause IN
  • une variable pour représenter à la fois la valeur et la syntaxe SQL (IE :l'exemple que vous avez fourni)

EXEC sp_executesql vous permet d'utiliser les paramètres bind/preparedstatement afin que vous n'ayez pas à vous soucier d'échapper aux guillemets simples/etc pour les attaques par injection SQL.