Sql 当提供的值为null时,删除where子句

Sql 当提供的值为null时,删除where子句,sql,sql-server,Sql,Sql Server,我想根据提供的值自动附加where子句 SELECT * FROM footable WHERE (Fromdate = @From OR @From IS NULL) AND (Todate = @TO OR @To IS NULL) 让我们考虑一个包含select查询的存储过程 CREATE PROCEDURE [dbo].[example] @From DATETIME, @T0 DATETIME AS BEGIN TRY SELECT *

我想根据提供的值自动附加where子句

SELECT * 
FROM footable 
WHERE (Fromdate = @From OR @From IS NULL)
  AND (Todate = @TO OR @To IS NULL)

让我们考虑一个包含select查询

的存储过程
CREATE PROCEDURE [dbo].[example]
    @From DATETIME,
    @T0 DATETIME
AS
  BEGIN TRY
      SELECT * 
      FROM footable 
      WHERE Fromdate = @From AND Todate = @TO
 END TRY
SELECT * 
FROM footable 
WHERE (Fromdate = @From OR @From IS NULL)
  AND (Todate = @TO OR @To IS NULL)
如果@From的值为null,则where子句必须为空

SELECT * 
FROM footable 
WHERE Todate = @TO
SELECT * 
FROM footable 
WHERE (Fromdate = @From OR @From IS NULL)
  AND (Todate = @TO OR @To IS NULL)
有什么方法可以实现这一点吗

SELECT * 
FROM footable 
WHERE (Fromdate = @From OR @From IS NULL)
  AND (Todate = @TO OR @To IS NULL)
非常感谢你的回答。但这也不能解决我的问题,因为
@From
@To
都是可选的。按照这种方法,我的代码希望

SELECT * 
FROM footable 
WHERE (Fromdate = @From OR @From IS NULL)
  AND (Todate = @TO OR @To IS NULL)

执行此操作将导致整个表。

只需使用常规逻辑即可处理它

SELECT * 
FROM footable 
WHERE (Fromdate = @From OR @From IS NULL)
  AND (Todate = @TO OR @To IS NULL)
SELECT * 
FROM footable 
WHERE (Fromdate = @From or @From is null)
AND Todate = @TO
option (OPTIMIZE FOR (@From UNKNOWN))
编辑:在中添加了
选项
子句,以便查询计划针对未知值进行优化,而不受参数嗅探的影响,从而在缓存中创建初始计划。或者,如果已知用法,则可以使用已知值生成所需的计划

SELECT * 
FROM footable 
WHERE (Fromdate = @From OR @From IS NULL)
  AND (Todate = @TO OR @To IS NULL)

在执行
选项(重新编译)
之前,我会先选择此选项,这要求无论何时都要生成计划。

Andrew的解决方案是解决此问题的一个很好的方法。但是要小心,您可能会遇到性能问题,尤其是当数量或参数增加时。盖尔·肖(Gail Shaw)有一篇关于这类事情的文章。可能重复我不确定你问的问题是否正确,看起来你想筛选介于日期参数之间的数据,但这样做行不通,因为你要将日期时间与
@from=fromdate
匹配。抱歉,如果我wrong@Tanner-我认为你是对的,但是考虑到它的from
footable
,我不确定代码是否代表了正确的程序,但只是为了回答这个问题。参数
@T0
随后是
@TO
稍后(从零到零)@Tanner:你完全正确。这不是我想要写的代码。安德鲁:完全正确,这肯定会起作用,但很可能会出现性能问题。如果使用NOT NULL参数集运行此存储过程,则它将生成也将用于NULL的计划。是的,使用这种查询的稳定计划是有问题的-这是一个有效的调用,我将在中添加选项以限制
优化
建议。
SELECT * 
FROM footable 
WHERE (Fromdate = @From OR @From IS NULL)
  AND (Todate = @TO OR @To IS NULL)