Sql 存储过程中WHERE子句的条件

Sql 存储过程中WHERE子句的条件,sql,sql-server,tsql,stored-procedures,where-clause,Sql,Sql Server,Tsql,Stored Procedures,Where Clause,我正在使用一个存储过程,其中我希望根据两个参数的值添加或删除where子句 到目前为止,我得到的是: WHERE t.iDdPais = @iIdPais AND t.iIdRegion = @iIdRegion AND t.dtFecha BETWEEN @dtStart AND @dtEnd 但是,如果@iIdPais是0(表示ALL),我需要从WHERE语句中删除该子句,这同样适用于@iIdRegion。您只需要使用普通布尔逻辑: WHERE (@iIdPaid

我正在使用一个存储过程,其中我希望根据两个参数的值添加或删除where子句

到目前为止,我得到的是:

WHERE 
   t.iDdPais = @iIdPais
   AND t.iIdRegion = @iIdRegion
   AND t.dtFecha BETWEEN @dtStart AND @dtEnd

但是,如果@iIdPais是0(表示ALL),我需要从WHERE语句中删除该子句,这同样适用于@iIdRegion。

您只需要使用普通布尔逻辑:

WHERE 
  (@iIdPaid = 0 OR t.iDdPais = @iIdPais)
  AND (@iIdRegion=0 OR t.iIdRegion = @iIdRegion)
  AND t.dtFecha BETWEEN @dtStart AND @dtEnd

将整个
SELECT
放入
IF
子句中

IF(@ildPais =0 AND @ildRegion =0)
SELECT <THE DATASET> FROM THE TABLE
WHERE 
   t.iDdPais = @iIdPais
   AND t.iIdRegion = @iIdRegion
   AND t.dtFecha BETWEEN @dtStart AND @dtEnd

ELSE 
SELECT <THE DATASET> FROM THE TABLE
--no where clause
IF(@ildPais=0和@ildRegion=0)
从表中选择
哪里
t、 iDdPais=@iIdPais
而t.iIdRegion=@iIdRegion
以及@dtStart和@dtEnd之间的t.dtFecha
其他的
从表中选择
--无where条款

您是否关心查询的性能?潜在的重复:(?)如果有任何重复,它就是这个:@GordonLinoff因为这是一个将不时执行的查询,而且这些表是目录式的,所以我更关心查询。非常优雅。谢谢如果数据集很小,那很好,但是如果表有一百万行呢?这两个额外的检查每次都会发生一百万次。这比公认的答案要好得多,因为后者的性能会很差。@HLGEM我不知道您使用的是什么RDBMS系统,但我是在sql server上进行的,它的表有数千万行,没有太多的问题。这些类型的查询永远不会是最快的,但是有了正确的索引,这种查询就可以了。