Procédure stockée bits paramètre activation de clause where supplémentaire pour vérifier la valeur null
J'ai une procédure stockée qui ressemble à:
CREATE PROCEDURE dbo.usp_TestFilter
@AdditionalFilter BIT = 1
AS
SELECT *
FROM dbo.SomeTable T
WHERE
T.Column1 IS NOT NULL
AND CASE WHEN @AdditionalFilter = 1 THEN
T.Column2 IS NOT NULL
Inutile de dire que cela ne fonctionne pas. Comment puis-je activer la clause where supplémentaire qui vérifie l' @AdditionalFilter paramètre? Merci pour toute aide.
OriginalL'auteur Alex Angas | 2008-09-30
Vous devez vous connecter pour publier un commentaire.
Si @AdditionalFilter est 0, la colonne ne sera pas évalué, car il ne peut pas affecter le résultat de la partie entre crochets. Si c'est autre chose que 0, la colonne condition sera évaluée.
OriginalL'auteur Johan
Cette pratique tend à confondre l'optimiseur de requête. J'ai vu SQL Server 2000 construire le plan d'exécution exactement l'inverse et l'utilisation d'un index sur Colonne1 lorsque le drapeau est réglé et vice-versa. SQL Server 2005 semblait d'obtenir au moins le plan d'exécution à droite sur la première compilation, mais vous avez alors un nouveau problème. Le système de caches compilé les plans d'exécution et tente de les réutiliser. Si vous utilisez d'abord la requête d'une manière, il sera toujours exécuter la requête de cette façon, même si le paramètre supplémentaire changements, et les différents indices serait plus approprié.
Vous pouvez forcer une procédure stockée pour être recompilé sur cette exécution à l'aide de
WITH RECOMPILE
dans leEXEC
déclaration, ou à chaque fois, en spécifiantWITH RECOMPILE
sur leCREATE PROCEDURE
déclaration. Il y aura une pénalité que SQL Server ré-analyse et optimisation de la requête à chaque fois.En général, si la forme de votre requête va changer, utilisez le SQL dynamique de génération de avec des paramètres. SQL Serveur de cache des plans d'exécution des requêtes paramétrées et auto-requêtes paramétrées (où il essaie de déduire quels sont les arguments qui sont des paramètres), et, même régulièrement des requêtes, mais il donne plus de poids à l'exécution de la procédure stockée plans, alors paramétré, auto-paramétrés et des requêtes régulières dans cet ordre. Plus le poids, plus il peut rester dans la mémoire vive avant que le plan est mis au rebut, si le serveur a besoin de la mémoire pour autre chose.
OriginalL'auteur Mike Dimmick
OriginalL'auteur Alexander Kojevnikov
OriginalL'auteur Matt Hamilton