共用方式為


SR0015:從 WHERE 述詞擷取決定性的函式呼叫

RuleId

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

請參閱

概念

分析資料庫程式碼以改善程式碼品質