SARGable查询where参数为NULL

时间:2018-02-12 17:21:36

标签: sql performance sql-server-2016

我有以下存储过程

CREATE PROCEDURE my_proc
(
   @Person VARCHAR(50)
)
AS
SELECT updatedBy
FROM   MyTable t
WHERE  updatedBy = @Person AND updatedDate > DATEADD(day,-1,GETDATE()) OR
       @CompletedBy IS NULL

最后一行(OR @CompletedBy IS NULL)确保如果没有传递参数,将显示所有记录。但是,查看执行计划,即使在提供参数时调用过程也会导致聚簇索引扫描。

如果我取出OR,则查询使用索引搜索。

有没有办法可以留下捕获所有行为并且不会导致索引扫描?

1 个答案:

答案 0 :(得分:2)

这是存储过程的一个优点。您可以构建两个查询,并使用If块来决定运行哪个查询。

或者,您可以将其构建为仅包含实际需要的WHERE子句元素的动态SQL,然后使用sp_executesql来运行结果。