Me preguntaba si había una forma de hacer esto en 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
¿Es posible hacerlo?
sql
sql-server
sql-server-2005
tsql
dynamic-sql
StealthRT
fuente
fuente
Respuestas:
Es posible, pero requiere el uso de SQL dinámico.
Recomiendo leer La maldición y las bendiciones del SQL dinámico antes de continuar ...
El SQL dinámico es solo una declaración de SQL, compuesta como una cadena antes de ejecutarse. Entonces ocurre la concatenación de cadenas habitual. Se requiere SQL dinámico siempre que desee hacer algo en la sintaxis SQL que no está permitido, como:
EXEC sp_executesql
le permite usar parámetros de vinculación / declaración preparada para que no tenga que preocuparse por escapar de comillas simples / etc. para ataques de inyección SQL.fuente
Luego cambie su consulta para usar esta lógica:
fuente
Usando EXEC
Puede utilizar el siguiente ejemplo para crear una declaración SQL.
Usando sp_executesql
Con este enfoque, puede asegurarse de que los valores de datos que se pasan a la consulta sean los tipos de datos correctos y evitar el uso de más comillas.
Referencia
fuente
Señalaré que en el artículo vinculado en la respuesta mejor calificada The Curse and Blessings of Dynamic SQL, el autor afirma que la respuesta es no usar SQL dinámico. Desplácese casi hasta el final para ver esto.
Del artículo: "El método correcto es descomprimir la lista en una tabla con una función definida por el usuario o un procedimiento almacenado".
Por supuesto, una vez que la lista está en una tabla, puede usar una combinación. No pude comentar directamente sobre la respuesta mejor calificada, así que acabo de agregar este comentario.
fuente