sql >> Databáze >  >> RDS >> Sqlserver

Deklarovat proměnnou pro řetězec dotazu

Je to možné, ale vyžaduje to použití dynamického SQL.
Doporučuji přečíst Prokletí a požehnání dynamické SQL než budete pokračovat...

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)

Dynamický SQL je pouze příkaz SQL, který se před provedením skládá jako řetězec. Dochází tedy k obvyklému zřetězení řetězců. Dynamické SQL je vyžadováno vždy, když chcete v syntaxi SQL provést něco, co není povoleno, například:

  • jediný parametr představující seznam hodnot oddělených čárkami pro klauzuli IN
  • proměnná reprezentující hodnotu i syntaxi SQL (IE:příklad, který jste uvedli)

EXEC sp_executesql umožňuje používat parametry bind/preparedstatement, takže se nemusíte starat o únik jednoduchých uvozovek/atd. pro útoky SQL injection.



  1. Aktualizujte jeden řádek z páru řádků, kde oba řádky dohromady splňují určitá kritéria

  2. Výběr procesoru pro SQL Server 2014 – část 2

  3. Jak odstranit podmínky z klauzule WHERE, pokud jsou parametry NULL

  4. Postup řešení bez parametrů