sql >> Base de Datos >  >> RDS >> Sqlserver

Declarar variable para una cadena de consulta

Es posible, pero requiere el uso de SQL dinámico.
Recomiendo leer La maldición y las bendiciones de la dinámica SQL antes de continuar...

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)

SQL dinámico es solo una instrucción SQL, compuesta como una cadena antes de ejecutarse. Entonces ocurre la concatenación de cadenas habitual. Se requiere SQL dinámico siempre que desee hacer algo en sintaxis SQL que no está permitido, como:

  • un solo parámetro para representar una lista de valores separados por comas para una cláusula IN
  • una variable para representar tanto el valor como la sintaxis SQL (IE:el ejemplo que proporcionó)

EXEC sp_executesql le permite usar parámetros bind/preparedstatement para que no tenga que preocuparse por escapar de comillas simples/etc para ataques de inyección SQL.