我正在使用几个可选参数处理存储过程.其中一些参数是单个值,使用WHERE子句很容易,如:
WHERE (@parameter IS NULL OR column = @parameter)
但是,在某些情况下,WHERE条件更复杂:
WHERE (@NewGroupId IS NULL OR si.SiteId IN (SELECT gs.SiteId FROM [UtilityWeb].[dbo].[GroupSites] AS gs WHERE gs.GroupId = @NewGroupId))
当我取消注释这些复杂的WHERE子句时,查询执行时间加倍,执行计划变得非常复杂.虽然执行计划不会打扰我,但是查询的执行时间加倍是一个明确的问题.
是否存在其他人在其存储过程中使用可选参数时发现的最佳实践或模式?
这是动态SQL是更好的解决方案吗?
我会为可用或不可用的参数创建单独的查询.
这将创建更简单的SQL,优化器将做得更好.
像这样:
if (@parameter IS NULL) then begin select * from foo end else begin select * from foo where value = @parameter end
在你需要重新设计许多参数时,你需要动态的sql解决方案,然后也总是使用参数,你可能会被SQL-Injection错误所困扰.
组合也是可能的.最可能使用的查询/查询,您可以完整编码,并获得预编译.所有其他组合都是动态创建的.