我有以下存储过程
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,则查询使用索引搜索。
有没有办法可以留下捕获所有行为并且不会导致索引扫描?
答案 0 :(得分:2)
这是存储过程的一个优点。您可以构建两个查询,并使用If
块来决定运行哪个查询。
或者,您可以将其构建为仅包含实际需要的WHERE子句元素的动态SQL,然后使用sp_executesql
来运行结果。