2011-07-06 89 views
0

我需要为搜索页面编写一个存储过程。搜索页面允许用户为某些过滤器选择“任何”,每个过滤器映射到我的数据库中的一列。SQL服务器中的条件过滤

什么是我的存储过程接近这一目标的最佳方式:

(1)我应该去使用动态SQL(sp_executesql的),并构建基于过滤器选择的查询?这会对缓存执行计划产生任何负面影响吗?

(2)我应该将“Any”翻译为所有可能的值并在静态查询中使用它们吗? (3)我应该使用强制过滤器将结果存储在临时表中,然后在这些结果上逐一应用可选过滤器(支持ANY选项)?

(4)我没有想过的其他方法?

+0

不是一个完整的答案,所以我会发表评论,但做**不做** 2' - 查询引擎仍然会检查该字段,当它不需要(即如果您指定一个列表对于IN列表中所有值的表,它仍然会检查每一行) – JNK

+3

关于此主题的必读内容; http://www.sommarskog.se/dyn-search.html –

回答

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_ACOL_A列的筛选值。如果用户选择了ANY,则FILTER_FOR_COL_A将是NULL。显然,如果COL_A可以是NULL,并且用户应该能够将其指定为过滤器,但NULL不是表示ANY过滤器的最佳方式。您需要为此考虑另一个值或第二个参数。此外,如果用户可以为一列指定多个过滤器值,则此方法将不起作用。

+0

保证给你很差的执行计划。埃里兰Sommarskog的亚历克斯链接到的博客涵盖了一些血淋淋的细节。不是通过指定语句RECOMPILE在SP1 +中被破坏并被删除的SQL2008方法来让您的示例运行良好。 –