我有一个参数化存储过程。其中一个参数是@aName
,允许为NULL
且通常为空。
存储过程中的查询包含以下过滤器:
AND Name LIKE ('%' + ISNULL(@aName,Name) + '%')
这个过滤器有效但由于以下原因而使我效率低下:
如果@aName
为空,那么我们只想Name = Name
,但我们得到Name LIKE ('%Name%')
。
如何使滤波器短路,以便获得以下信息:
Name = Name
或1=1
。Name LIKE ('%Name%')
。答案 0 :(得分:4)
您正在考虑的问题是:
AND (@aName IS NULL OR Name LIKE ('%' + @aName + '%') )
我认为不会有明显的速度差异。
你也可以打开"打开"整个查询:
IF (@aName IS NULL)
BEGIN
SELECT . . .
FROM . . .
WHERE . . .
END;
ELSE
SELECT . . .
FROM
WHERE . . . AND
LIKE ('%' + @aName + '%')
END;
这将为第一个版本带来优化优势。
答案 1 :(得分:3)
仅在@aName
不是@aName
时检查名称是否与null
一样。
AND (@aName is null or Name LIKE '%' + @aName + '%')