【发布时间】:2010-06-23 20:07:14
【问题描述】:
我想在具有许多过滤器的存储过程中编写查询,但我想避免使用动态 SQL。
假设我的参数可以为空(@filter1、@filter2、@filter3...)。我可能解决这个问题的一种方法是:
SELECT col1, col2, col3
FROM table
WHERE col1 = ISNULL(@filter1, col1)
AND col2 = ISNULL(@filter2, col2)
AND col3 = ISNULL(@filter3, col3)
如果不为空,则此结果将由适当的过滤器过滤。问题是: 1)这是一种好习惯吗? 2) 优化器会优化 col1 = col1 还是会影响查询性能?
【问题讨论】:
-
性能会很糟糕,因为有太多可能的组合,查询计划不太可能被缓存。动态 SQL 是一个更好的选择。
-
Erland Sommarskog 将an excellent article 放在一起解决此类问题。我强烈建议您通读一遍。
标签: sql sql-server query-optimization