Sql 当提供的值为null时,删除where子句
我想根据提供的值自动附加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 *
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-我认为你是对的,但是考虑到它的fromfootable
,我不确定代码是否代表了正确的程序,但只是为了回答这个问题。参数@T0
随后是@TO
稍后(从零到零)@Tanner:你完全正确。这不是我想要写的代码。安德鲁:完全正确,这肯定会起作用,但很可能会出现性能问题。如果使用NOT NULL参数集运行此存储过程,则它将生成也将用于NULL的计划。是的,使用这种查询的稳定计划是有问题的-这是一个有效的调用,我将在中添加选项以限制优化
建议。
SELECT *
FROM footable
WHERE (Fromdate = @From OR @From IS NULL)
AND (Todate = @TO OR @To IS NULL)