Eu queria saber se havia uma maneira de fazer isso 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
Isso é possível fazer?
sql
sql-server
sql-server-2005
tsql
dynamic-sql
StealthRT
fonte
fonte
Respostas:
É possível, mas requer o uso de SQL dinâmico.
Eu recomendo ler A maldição e as bênçãos do SQL dinâmico antes de continuar ...
SQL dinâmico é apenas uma instrução SQL, composta como uma string antes de ser executada. Portanto, ocorre a concatenação usual de strings. O SQL dinâmico é necessário sempre que você deseja fazer algo na sintaxe SQL que não é permitido, como:
EXEC sp_executesql
permite que você use parâmetros de instrução de ligação / preparada para que você não precise se preocupar em escapar de aspas simples / etc para ataques de injeção de SQL.fonte
Em seguida, altere sua consulta para usar esta lógica:
fonte
Usando EXEC
Você pode usar o seguinte exemplo para construir a instrução SQL.
Usando sp_executesql
Com o uso dessa abordagem, você pode garantir que os valores dos dados passados para a consulta sejam os tipos de dados corretos e evitar o uso de mais aspas.
Referência
fonte
Vou apontar que, no artigo com link na resposta com melhor classificação, A maldição e as bênçãos do SQL dinâmico, o autor afirma que a resposta é não usar SQL dinâmico. Role quase até o fim para ver isso.
Do artigo: "O método correto é descompactar a lista em uma tabela com uma função definida pelo usuário ou um procedimento armazenado."
Claro, uma vez que a lista está em uma tabela, você pode usar uma junção. Não pude comentar diretamente sobre a resposta com melhor classificação, então apenas adicionei este comentário.
fonte