我希望能够传入一个参数列表,并忽略那些为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缓存查询计划,因此具有相同args的任何查询都可能会重新使用该计划.
缺点是除非您签署SPROC,否则调用者需要对表的SELECT权限(而不仅仅是SPROC上的EXEC权限).
我会这样处理它.
WHERE Thing = ISNULL(@Thing, Thing)
如果您只是将参数用作where子句的过滤器,那么这将非常有效.如果参数为null,它将忽略该参数.
我一般用
WHERE (id = @id OR @id IS NULL) AND (num = @num OR @num IS NULL)
等等