Ajouter des clauses WHERE à SQL dynamiquement / par programme
Comment puis-je ajouter de la condition de recherche à la Procédure Stockée SQL par programmation?
Dans mon application C#) je suis à l'aide d'une procédure stockée (SQL Server 2008R2)
ALTER PROCEDURE [dbo].[PROC001]
@userID varchar(20),
@password varchar(20)
AS
SELECT * FROM tUsers WHERE RTRIM(Name) = @userID AND RTRIM(Password) = @password
Je veux prolonger cette requête par plusieurs conditions, et maintenant je ne sais pas combien de conditions d'utilisation de cette requête en raison de l'exécution de programme.. 2, 3, 6 OU 20. Je veux ajouter ces conditions par programmation comme:
SELECT * FROM tUsers WHERE RTRIM(Name) = @userID AND RTRIM(Password) = @password
AND Field2 = '1' AND Field3 = '0' OR Field4 <> '8' AND Field5 < '100' ....
Est-il possible d'envoyé des conditions de procédure stockée de façon dynamique?
source d'informationauteur mbigun
Vous devez vous connecter pour publier un commentaire.
Modifier la Préférence pour LINQ en fonction de l'ORM, si possible
Si vous n'avez pas besoin de le faire dans l'agitation, une meilleure solution consiste à utiliser un ORM qui sera finalement de construire paramétrée ad-hoc sql. C'est le meilleur des deux mondes - vous obtenir de la souplesse d'une requête dynamique, avec pas redondant filtres à bouleverser l'optimiseur, le plan de requête elle-même est mis en cache, et vous êtes à l'abri des méchants comme les attaques par injection. Et une Linq base de l'ORM requête fait pour en faciliter la lecture:
Pour des requêtes complexes, vous pouvez regarder la PredicateBuilder
ADO /manuel de construction des requêtes
Vous pouvez utiliser
sp_executesql
de construire SQL dynamiquement, comme par ci-dessous. À condition que vous paramétrer les variables que vous devriez être à l'abri de problèmes comme l'injection SQL et d'échapper à des citations etc seront traitées pour vous.Re, pourquoi est -
WHERE (@x IS NULL OR @x = Column)
une mauvaise idée?(À partir de mon commentaire ci-dessous)
Bien que le "paramètre optionnel' modèle fonctionne bien comme un "couteau suisse" pour l'interrogation d'une multitude de combinaisons de filtres en option lorsqu'il est utilisé sur de petites tables, malheureusement, pour les grandes tables, il en résulte un plan de requête unique pour toutes les permutations de filtres de la requête, ce qui peut entraîner de mauvaises performances de la requête avec certaines combinaisons de paramètres optionnels en raison de la la détection des paramètres de problème. Si possible, vous devez éliminer les redondant filtres entièrement.
Re: Pourquoi l'application de fonctions dans les prédicats d'être une mauvaise idée
par exemple
Utilisation de fonctions dans les prédicats fréquemment disqualifie l'utilisation des index par le SGBD ("non sargable").
Dans ce cas,
RTRIM
est inutile, car Sql server ignore espaces lors de la comparaison.Vous pouvez le faire en sql, comme ceci:
Si aucun paramètre passé à la procédure stockée avec un
NULL
valeur de l'ensemble de l'état sera ignoré.Noter que: j'ai ajouté
WHERE 1 = 1
afin de rendre le travail de requête dans le cas où aucun paramètre passé à la requête et dans ce cas alll le résultat sera retourné, depuis1 = 1
est toujours vrai.vous pourriez avoir votre procédure comme une chaîne de caractères, et d'envoyer une chaîne de caractères avec les conditions, concaténer et exec.
Pourquoi ne pas vous créer votre clause where dans votre code C# et le passer à la procédure stockée.
Dans votre C# ne l'aime:
puis la passer dans la procédure stockée, et de l'utiliser dans la procédure stockée comme ceci: