2010-02-17 6 views
1

J'ai une requête comme suitPouvons-nous passer null au paramètre sql pour interroger tout?

select * from table where col1 = @param1 and col2 = @parm2 

Et un autre

select * from table where col1 = @param1 

Est-il possible faire les deux opérations dans la même requête basée sur paramètre passé, si elle est requête nulle tout ou lorsque le paramètre a une valeur sélectionnez leur.

Mes requêtes sont très grandes et je dois créer 2 versions de sp pour chacun et je pensais que je peux essayer d'éviter d'en créer deux.

+1

L'utilisation de isnull ou coalesce peut entraîner des scans de table sur votre table. Tester l'impact de ceci va être crucial et peut influencer votre décision en fonction de votre environnement. –

+1

Très vrai. Le choix entre "code plus simple" et performance ne doit pas être pris à la légère. –

+0

convenu et j'ai testé les deux et les garder séparés et ils courent plus vite que d'utiliser isnull, coalesce –

Répondre

2
SELECT * from table where col1 = @param1 and col2 = isnull(@parm2, col2) 

doit faire ce que vous cherchez.

1

Eh bien, vous pouvez essayer, mais je ne pense pas que ce sera très performant:

SELECT * FROM tab WHERE col1 = @param1 AND col2 = ISNULL(@parm2, col2) 
1

Vous pouvez essayer quelque chose comme:

select * from table where coalesce(@param1, col1) = col1 
and coalesce(@param2, col2) = col2 
0

Que diriez-vous ceci:

select * 
    from table 
    where where (col1 = @param1 and col2 = @parm2) 
    or (col1 = @param1 and parm2 is null) 
0

Si vous utilisez des procédures stockées!

IF Boolean_expression 
    { sql_statement | statement_block } 
[ ELSE 
    { sql_statement | statement_block } ] 

Dans votre scénario. quelque chose comme

if (@param1 = null) 
Begin 
select * from table where col2 = @parm2 
( 
End 

else if (@param1 = 'something') 
Begin 
(
select * from table where col1 = @param1 
End 

Référence: http://msdn.microsoft.com/en-us/library/ms182717.aspx

1

Toutes les suggestions ici sur l'utilisation COALESCE ou ISNULL sera travail - faire efficacement ceci:

select * 
from table 
where (@param1 IS NULL OR col1 = @param1) 
    and (@parm2 IS NULL OR col2 = @parm2) 

Mais vous devrez peut-être surveiller pour le reniflage des paramètres. SQL Server 2005 n'a pas le paramètre OPTIMISER POUR INCONNU - vous pouvez masquer les paramètres dans les variables locales du SP pour éviter cela ou utiliser l'option RECOMPILE.

Questions connexes