SR0015:从 WHERE 谓词提取确定性的函数调用
规则 ID |
SR0015 |
类别 |
Microsoft.Performance |
是否重大更改 |
非重大更改 |
原因
WHERE 谓词包含一个或多个确定性函数调用。
规则说明
在 WHERE 谓词中,如果函数调用的值不依赖于所选数据,则该函数调用是确定的。 这种调用可能会导致降低数据库性能的不必要的表扫描。
如何解决冲突
若要解决此问题,可将调用结果分配给在 WHERE 谓词中使用的变量。
何时禁止显示警告
如果 WHERE 谓词所引用的表将永远不会包含几行以上,则可以禁止显示此警告。
示例
在第一个示例中,存储过程包括确定性的函数调用和 WHERE 谓词中的 ABS(@param1)。 第二个示例中,临时变量将保存调用的结果。
CREATE PROCEDURE [dbo].[Procedure2WithWarning]
@param1 INT = 0,
AS
BEGIN
SELECT [c1], [c2], [c3], [SmallString]
FROM [dbo].[Table1]
WHERE [c2] > ABS(@param1)
END
CREATE PROCEDURE [dbo].[Procedure2Fixed]
@param1 INT = 0,
AS
BEGIN
DECLARE @AbsOfParam1 INT
SET @AbsOfParam1 = ABS(@param1)
SELECT [c1], [c2], [c3], [SmallString]
FROM [dbo].[Table1]
WHERE [c2] > @AbsOfParam1
END