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