我希望能够传入参数列表,并忽略那些为 NULL 的参数。这样查询实际上是假装过滤器不存在并忽略它。
我是这样做的:
(@thing IS NULL or Thing=@thing)
这是正确的,如果是这样,它的表现会很差吗?它似乎比单独构建 SQL 慢很多。
这样做的最佳方法是什么?
固定的!请参阅 Marc Gravell 的回答。总之,多次使用 IS NULL 是一个很大的性能损失。
请您参考如下方法:
一旦你获得了其中的几个,那么是的:它开始变得非常缓慢。在这种情况下,我倾向于使用生成的 TSQL - 即
DECLARE @sql nvarchar(4000)
SET @sql = /* core query */
IF @name IS NOT NULL
SET @sql = @sql + ' AND foo.Name = @name'
IF @dob IS NOT NULL
SET @sql = @sql + ' AND foo.DOB = @dob'
// etc
EXEC sp_ExecuteSQL @sql, N'@name varchar(100), @dob datetime',
@name, @dob
等等
请注意, sp_ExecuteSQL 缓存查询计划,因此任何具有相同参数的查询都可能重复使用该计划。
缺点是除非您签署 SPROC,否则调用者需要对表具有 SELECT 权限(而不仅仅是对 SPROC 的 EXEC 权限)。