Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Dichiara una variabile per una stringa di query

È possibile, ma richiede l'utilizzo di SQL dinamico.
Raccomando di leggere La maledizione e le benedizioni della dinamica SQL prima di continuare...

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 è solo un'istruzione SQL, composta come una stringa prima di essere eseguita. Quindi si verifica la solita concatenazione di stringhe. L'SQL dinamico è richiesto ogni volta che vuoi fare qualcosa nella sintassi SQL che non è consentita, come:

  • un singolo parametro per rappresentare un elenco di valori separato da virgole per una clausola IN
  • una variabile per rappresentare sia il valore che la sintassi SQL (IE:l'esempio che hai fornito)

EXEC sp_executesql ti consente di utilizzare i parametri bind/preparedstatement in modo da non doverti preoccupare di sfuggire a virgolette singole/ecc per attacchi SQL injection.