Je me demandais s'il y avait un moyen de le faire dans 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
Est-ce possible?
sql
sql-server
sql-server-2005
tsql
dynamic-sql
StealthRT
la source
la source
Réponses:
C'est possible, mais cela nécessite l'utilisation de SQL dynamique.
Je recommande de lire La malédiction et les bénédictions du SQL dynamique avant de continuer ...
Le SQL dynamique est simplement une instruction SQL, composée sous forme de chaîne avant d'être exécutée. Ainsi, la concaténation de chaînes habituelle se produit. Le SQL dynamique est requis chaque fois que vous voulez faire quelque chose dans la syntaxe SQL qui n'est pas autorisé, comme:
EXEC sp_executesql
vous permet d'utiliser les paramètres bind / preparestatement afin que vous n'ayez pas à vous soucier des échappements entre guillemets simples / etc pour les attaques par injection SQL.la source
Modifiez ensuite votre requête pour utiliser cette logique:
la source
Utiliser EXEC
Vous pouvez utiliser l'exemple suivant pour créer une instruction SQL.
Utilisation de sp_executesql
En utilisant cette approche, vous pouvez vous assurer que les valeurs de données transmises à la requête sont les types de données corrects et ne pas utiliser plus de guillemets.
Référence
la source
Je soulignerai que dans l'article lié à la réponse la mieux notée La malédiction et les bénédictions du SQL dynamique, l'auteur déclare que la réponse n'est pas d'utiliser le SQL dynamique. Faites défiler presque jusqu'à la fin pour voir ceci.
De l'article: "La méthode correcte consiste à décompresser la liste dans une table avec une fonction définie par l'utilisateur ou une procédure stockée."
Bien sûr, une fois que la liste est dans une table, vous pouvez utiliser une jointure. Je ne pouvais pas commenter directement la réponse la mieux notée, je viens donc d'ajouter ce commentaire.
la source