2009-09-20 10 views
1

J'ai la requête suivante (exécutée dans un sproc):SQL Server 2008 - en ignorant les valeurs nulles

DECLARE @BrandId uniqueidentifier

SELECT * FROM produits p où p.BrandId = @BrandId

Ma question est - quand NULL est passé dans @BrandId la requête (correctement) aucun résultat - est-il un moyen de dire SQL pour retourner toutes lignes lorsque NULL est passé dans @BrandId (sans utiliser beaucoup de Déclarations IF, c'est-à-dire - IF @BrandId IS NULL etc.)? - c'est-à-dire si @BrandId = NULL lorsque 'ignore' cette partie de la clause where. Ci-dessus est un exemple simplifié - la requête réelle est plus longue et a plusieurs variables (comme @BrandId) qui peuvent être passées des valeurs nulles - et le comportement souhaité est pour eux de ne pas limiter les résultats de la requête lorsqu'une valeur nulle est passé.

Merci!

Répondre

2
DECLARE @BrandId uniqueidentifier; 

SELECT * FROM Products p WHERE p.BrandId = ISNULL(@BrandId, p.BrandId); 

Mon seul commentaire est que si vous avez beaucoup de produits, ce modèle de requête ne sera pas optimisé pour le cas où BrandId est NULL (si vous mettez la requête dans une procédure stockée) car une seule plan peut être stocké par procédure par déclaration.

Si vous utilisez cette déclaration dans un proc stocké et vous vraiment à haute performance (qui est, si vous avez beaucoup de produits et que vous exécutez cette requête beaucoup), vous devez utiliser:

IF @BrandId IS NULL BEGIN 
    SELECT * FROM Products p; 
END ELSE BEGIN 
    SELECT * FROM Products p WHERE p.BrandId = @BrandId; 
END 
+0

excellent - merci! – db1234

+0

Cette forme est également sujette à un reniflage de paramètres, ce qui peut entraîner des plans exécutifs très médiocres, selon la façon dont la proc est appelée la première fois. http://sqlinthewild.co.za/index.php/2009/09/15/multiple-execution-paths/ – GilaMonster

Questions connexes