Объявлять переменную для строки запроса
Привет всем, мне было интересно, есть ли способ сделать это в MS SQL Server 2005:
DECLARE @theDate varchar(60)
SET @theDate = '''2010-01-01'' AND ''2010-08-31 23:59:59'''
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
)
... etc
Можно сделать?
Дэвид
Ответы
Ответ 1
Это возможно, но для этого требуется использовать динамический SQL.
Я рекомендую читать Проклятие и благословения динамического SQL, прежде чем продолжить...
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 - это всего лишь оператор SQL, составленный как строка перед выполнением. Таким образом происходит обычная конкатенация строк. Динамический SQL требуется всякий раз, когда вы хотите что-то сделать в синтаксисе SQL, который не разрешен, например:
- единственный параметр для представления списка значений, разделенных запятыми, для предложения IN
- переменная для представления как значения, так и синтаксиса SQL (IE: пример, который вы предоставили)
EXEC sp_executesql
позволяет вам использовать параметры bind/readystatement, поэтому вам не придется беспокоиться о том, чтобы избежать одиночных кавычек /etc для атак SQL-инъекций.
Ответ 2
DECLARE @theDate DATETIME
SET @theDate = '2010-01-01'
Затем измените свой запрос, чтобы использовать эту логику:
AND
(
tblWO.OrderDate > DATEADD(MILLISECOND, -1, @theDate)
AND tblWO.OrderDate < DATEADD(DAY, 1, @theDate)
)
Ответ 3
Точно это невозможно.
Вы можете построить весь запрос и выполнить его как строку.
Ответ 4
Использование EXEC
Вы можете использовать следующий пример для создания инструкции SQL.
DECLARE @sqlCommand varchar(1000)
DECLARE @columnList varchar(75)
DECLARE @city varchar(75)
SET @columnList = 'CustomerID, ContactName, City'
SET @city = '''London'''
SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = ' + @city
EXEC (@sqlCommand)
Использование sp_executesql
Используя этот подход, вы можете убедиться, что значения данных, передаваемые в запрос, являются правильными типами данных и позволяют использовать больше кавычек.
DECLARE @sqlCommand nvarchar(1000)
DECLARE @columnList varchar(75)
DECLARE @city varchar(75)
SET @columnList = 'CustomerID, ContactName, City'
SET @city = 'London'
SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city
Ссылка