Declarar a variável para um texto de pesquisa
estava a pensar se havia uma maneira de fazer isto no 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
Isto é possível?
4 answers
DECLARE @theDate DATETIME
SET @theDate = '2010-01-01'
Então mude a sua consulta para usar esta lógica:
AND
(
tblWO.OrderDate > DATEADD(MILLISECOND, -1, @theDate)
AND tblWO.OrderDate < DATEADD(DAY, 1, @theDate)
)
Utilizar EXEC
Pode usar o seguinte exemplo para construir a instrução 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)
Usando sp_ ExecuteSQL
Com esta abordagem, pode garantir que os valores dos dados que estão a ser passados para a consulta são os tipos de dados correctos e evitar o uso de mais citações.
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
Vou salientar que no artigo ligado na resposta top rated A maldição e as bênçãos do Dinâmico SQL o autor afirma que a resposta não é usar o dinâmico SQL. Role quase até ao fim para ver isto.
A partir do artigo: "o método correcto é desempacotar a lista numa tabela com uma função definida pelo utilizador ou um procedimento armazenado."
Claro, uma vez que a lista está numa tabela, você pode usar uma junção. Não podia comentar directamente a resposta mais notada, por isso ... adicionei este comentário.