Skip to main content
 首页 » 编程设计

performance之忽略 T-SQL 中的 NULL 参数

2024年11月24日12unruledboy

我希望能够传入参数列表,并忽略那些为 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 权限)。