我需要为搜索页面编写存储过程。搜索页面允许用户为某些过滤器选择“任意”,每个过滤器映射到我的数据库中的列。
在我的存储过程中处理此问题的最佳方法是什么:
(1)我应该使用动态SQL(sp_executesql)并根据所选的过滤器构建查询吗?这会对执行计划的缓存产生任何负面影响吗?
(2)我应该将“Any”翻译成所有可能的值并在静态查询中使用它吗?
(3)我是否应该使用强制过滤器将结果存储在临时表中,然后对这些结果逐个应用可选过滤器(支持任何选项)?
(4)我没有想到的任何其他方法?
答案 0 :(得分:2)
在不知道用户如何选择过滤器的情况下,我会做这样的事情:
SELECT * FROM TABLE
WHERE (FILTER_FOR_COL_A IS NULL OR COL_A = FILTER_FOR_COL_A)
AND (FILTER_FOR_COL_B IS NULL OR COL_B = FILTER_FOR_COL_B)
FILTER_FOR_COL_A
是列COL_A
的过滤器值。如果用户选择了ANY
,则FILTER_FOR_COL_A
将为NULL
。显然,如果COL_A
可以NULL
并且用户应该能够将其指定为过滤器,则NULL
不是表示ANY
过滤器的最佳方式。您需要考虑另一个值或第二个参数。此外,如果用户可以为一列指定多个过滤器值,则此方法将不起作用。