如何创建不带COALESCE的动态WHERE选择

| 我发现,如果在搜索中使用SQL 2008 R2数据库,则它确实在使用COALESCE函数。 码:
where 
    i.id_categ = COALESCE(@id_categ, i.id_categ )
    and i.id_brand = COALESCE(@id_brand , i.id_brand )
    and i.id_model = COALESCE(@id_model , i.id_model )
    and i.id_type = COALESCE(@id_karoseria, i.id_type )
    and i.id_fuel = COALESCE(@id_palivo, i.id_fuel )
    and (i.year between @year_from and @year_to)
    and (i.price between @price_from and @price_to)
动态变量:
ALTER PROCEDURE [dbo].[spInzeratSelect]
     @id_categ int = null,
     @id_brand int = null,
     @id_model int = null,
     @id_fuel int = null,
     @id_type int = null,
搜索可以使用或不使用这些变量。 基准测试:
  with COALESCE = Total Execution Time: 3582
  without COALESCE conditions = Total Execution Time: 13
你得到的区别... 是否有一个很好的解决方案,如何忽略COALESCE并以不同的方式创建动态SQL选择? 谢谢。     
已邀请:
t在非常特殊的情况下,应使用以下模式替换所有
COALESCE
搜索参数:
 AND ( (@id_brand IS NULL) OR (i.id_brand = @id_brand) )
等等 该参数在执行前被评估为文字,因此以这种方式使条件可保留。 这与查询在功能上等效,除了您首先要检查文字值,如果它实际上为null,则可以对其进行优化。 编辑:显然,这也是@Joe Stefanelli的链接中推荐的方法。我最初是从Erland Sommerskog偷猎的。 EDIT2:我也总是忘记提起
OPTION (RECOMPILE)
。     

要回复问题请先登录注册