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

请参见

概念

分析数据库代码以提高代码质量