2008-12-02 9 views
5

J'essaie d'écrire une requête pour une page de recherche avancée sur mon système d'archivage de documents. J'essaye de rechercher par de multiples paramètres facultatifs. J'ai environ 5 paramètres qui pourraient être des chaînes vides ou des chaînes de recherche. Je sais que je ne devrais pas avoir à vérifier chaque chaîne comme une chaîne ou vide et créer une procédure stockée séparée pour chaque combinaison.requête de recherche sql pour plusieurs paramètres optionnels

Edit: Ended à l'aide:

ISNULL(COALESCE(@var, a.col), '') = ISNULL(a.col, '') 
+0

Voir aussi: http://stackoverflow.com/questions/532468/ignoring-a-null-parameter-in-t-sql/532510#532510 –

Répondre

8

Vous pouvez utiliser COALESCE (ou ISNULL) comme ceci:

WHERE COALESCE(@var1, col1) = col1 
AND COALESCE(@var2, col2) = col2 
AND COALESCE(@var3, col3) = col3 
+2

Cette solution ne fonctionnera pas si la valeur de la colonne est NULL car vous ne pouvez pas tester NULL de cette façon. Si la valeur est NULL, la ligne sera filtrée. Ce n'est pas ce que tu veux. –

+0

Appel de fonction lorsque la condition ralentit la performance. Au lieu d'utiliser la fonction coalesce, appelez ceci, où (@ var1 est null ou col1 = @ var1) –

1

Vous pouvez mettre OU est dans votre clause WHERE comme ceci:

WHERE 
    (@var1 = '' OR col1 = @var1) AND 
    (@var2 = '' OR col1 = @var2) AND 
    (@var3 = '' OR col1 = @var3) ... 
+0

Bien que cette solution fonctionne, elle est incroyablement coûteuse. N'utilisez pas OR ... utilisez plutôt l'ISNULL (exemple ci-dessus). –

+2

Cette solution fonctionnera dans TOUS les cas. La solution IsNull/Coalesce ne fonctionnera que dans des circonstances contrôlées. Lorsque vous utilisez Coalesce, vous testez toujours une colonne pour EQUAL une valeur. Si la valeur de la colonne est NULL, elle ne sera pas EQUAL et la ligne ne sera PAS retournée. –

0

Vous pouvez passer des paramètres facultatifs à une procédure stockée, mais l'optimiseur va construire un plan basé sur les appels spécifiques que vous faites à ce proc. Il y a quelques astuces dans SQL Server 2005 et les versions ultérieures pour éviter cela (reniflage des paramètres, astuces sans compilation, etc.)

Même avec ça, je préfère construire une vue avec le noyau de la requête et puis utilisez cette vue dans plusieurs procs avec les paramètres spécifiques. Cela permet à SQL d'optimiser comme il le veut/devrait et je peux encore consolider les spécificités de la requête.

0

Encore mieux est de rendre le paramètre NULL en option et test dans la clause WHERE comme le cas de chaîne vide ...

6

que je fais habituellement ceci: P

WHERE (@var1 IS NULL OR col1 = @var1) 
AND (@var2 IS NULL OR col2 = @var2) 

...

1

Une alternative est de dynamique ally construit le SQL dans la procédure stockée, cela produit le meilleur plan possible pour la requête et un plan sera créé et utilisé de toute façon (en 2005 et au-dessus).