2008-09-30 3 views
4

j'ai une procédure stockée qui ressemble à:paramètre bit de procédure stockée activation supplémentaire clause where pour vérifier null

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 le paramètre @AdditionalFilter? Merci pour toute aide.

Répondre

6
CREATE PROCEDURE dbo.usp_TestFilter 
    @AdditionalFilter BIT = 1 
AS 
    SELECT * 
    FROM dbo.SomeTable T 
    WHERE 
    T.Column1 IS NOT NULL 
    AND (@AdditionalFilter = 0 OR 
     T.Column2 IS NOT NULL) 

Si @AdditionalFilter est 0, la colonne ne sera pas évaluée car elle ne peut pas influer sur le résultat de la partie entre crochets. Si ce n'est pas 0, la condition de la colonne sera évaluée.

1
CREATE PROCEDURE dbo.usp_TestFilter 
    @AdditionalFilter BIT = 1 
AS 
    SELECT * 
    FROM dbo.SomeTable T 
    WHERE 
    T.Column1 IS NOT NULL 
    AND (NOT @AdditionalFilter OR T.Column2 IS NOT NULL) 
0
select * 
from SomeTable t 
where t.Column1 is null 
and (@AdditionalFilter = 0 or t.Column2 is not null) 
4

Cette pratique a tendance à confondre l'optimiseur de requête. J'ai vu SQL Server 2000 construire le plan d'exécution exactement dans le sens inverse et utiliser un index sur Column1 lorsque l'indicateur a été défini et vice-versa. SQL Server 2005 semblait au moins obtenir le plan d'exécution dès la première compilation, mais vous avez alors un nouveau problème. Le système met en cache les plans d'exécution compilés et tente de les réutiliser. Si vous utilisez d'abord la requête dans un sens, elle exécutera toujours la requête de cette façon même si le paramètre supplémentaire change, et différents index seraient plus appropriés.

Vous pouvez forcer une procédure stockée recompilation sur cette exécution en utilisant WITH RECOMPILE dans la déclaration EXEC, ou chaque fois en spécifiant WITH RECOMPILE sur la déclaration CREATE PROCEDURE. Il y aura une pénalité car SQL Server ré-analyse et optimise la requête à chaque fois.

En général, si la forme de votre requête va changer, utilisez la génération SQL dynamique avec les paramètres. SQL Server mettra également en cache les plans d'exécution pour les requêtes paramétrées et les requêtes paramétrées automatiquement (où il tente de déduire quels arguments sont des paramètres), et même les requêtes régulières, mais il donne plus de poids aux plans d'exécution des procédures stockées. requêtes régulières dans cet ordre. Plus le poids est élevé, plus il peut rester longtemps dans la RAM avant que le plan ne soit supprimé, si le serveur a besoin de la mémoire pour autre chose.

Questions connexes