Jest to możliwe, ale wymaga użycia dynamicznego SQL.
Polecam przeczytanie Klątwa i błogosławieństwo dynamiki SQL
przed kontynuowaniem...
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)
Dynamiczny SQL to po prostu instrukcja SQL, złożona jako ciąg przed wykonaniem. Tak więc następuje zwykła konkatenacja ciągów. Dynamiczny SQL jest wymagany, gdy chcesz zrobić coś w składni SQL, co jest niedozwolone, na przykład:
- pojedynczy parametr reprezentujący listę wartości oddzielonych przecinkami dla klauzuli IN
- zmienna reprezentująca zarówno wartość, jak i składnię SQL (IE:podany przez Ciebie przykład)
EXEC sp_executesql
pozwala na użycie parametrów wiązania/preparedstatement, dzięki czemu nie musisz się martwić o unikanie pojedynczych cudzysłowów/itd. w przypadku ataków wstrzykiwania SQL.