2008-10-10 7 views
1

Quelle est la bonne façon de procéder? Par exemple, comment pourrais-je modifier une procédure stockée avec cette signature:Utilisation d'un paramètre tristate dans une procédure stockée

CREATE PROCEDURE dbo.MyProcedure 
    @Param BIT = NULL 
AS 
    SELECT * 
    FROM dbo.SomeTable T 
    WHERE T.SomeColumn = @Param 

Alors que donner @param d'une valeur de 1 ou 0 effectue le filtre, mais pas la spécification ou passer NULL effectue aucun filtrage? Je vous remercie.

Répondre

5

En supposant que NULL signifie que j'arrive de penser "ne se soucient pas", utilisez

CREATE PROCEDURE dbo.MyProcedure 
    @Param BIT = NULL 
AS 
    SELECT * 
    FROM dbo.SomeTable T 
    WHERE T.SomeColumn = @Param OR @Param IS NULL 
0

qui est la plus propre façon de le faire est (en T-SQL):

SELECT * FROM TABLE WHERE column = ISNULL(@param, column) 

D'autres SGBDR préféreraient COALESCE au lieu de ISNULL.

Je pense qu'il est plus évident de savoir quelle est l'intention ici, en particulier lorsque vous commencez à ajouter d'autres clauses OR, et cela vous évite également d'avoir besoin de parens lorsque vous combinez avec des clauses AND.

Dans mes tests (très) limités, il y avait aussi une augmentation négligeable de la performance en utilisant ISNULL versus OR @p IS NULL. Je ne préconise pas d'utiliser ISNULL car de l'augmentation de perf (ce qui est extrêmement marginal au mieux, et est sujet à des cas très spécifiques au pire) mais il est bon de savoir qu'il n'a pas un coût significatif. Franchement, je ne sais pas pourquoi cela ferait une différence de toute façon, mais le plan d'exécution montre une différence de 1% dans le coût du filtre.

1

Il y a plusieurs façons. En voici un:

SELECT * 
    FROM dbo.SomeTable T 
    WHERE T.SomeColumn = COALESCE(@Param, T.SomeColumn) 

mais cela n'inclura pas les lignes pour lesquelles T.SomeColumn est NULL.

L'alternative suivante comprendra les lignes:

SELECT * 
    FROM dbo.SomeTable T 
    WHERE T.SomeColumn = @Param OR @Param IS NULL 

mais il présente l'inconvénient du paramètre répété, ce qui est pas bien dans le cas où vous utilisez une autre façon de passer des paramètres, par exemple, en utilisant un espace réservé.

Questions connexes