SR0015: WHERE 述語から確定的な関数呼び出しを抽出します。

規則 ID

SR0015

分類

Microsoft.Performance

互換性に影響する変更点

なし

原因

WHERE 述語に 1 つ以上の確定的な関数呼び出しが含まれます。

規則の説明

WHERE 述語では、値が選択したデータに依存しない場合、関数呼び出しは確定的です。 このような呼び出しは、不要なテーブル スキャンの原因になり、データベースのパフォーマンスが低下することがあります。

違反の修正方法

この問題を解決するため、WHERE 述語に使用した変数に、呼び出しの結果を割り当てることができます。

警告を抑制する状況

WHERE 述語が参照するテーブルに多数の行が含まれることがない場合は、この警告を抑制できます。

使用例

最初の例では、ストアド プロシージャの WHERE 述語に確定的関数呼び出し ABS(@param1) が含まれます。 2 番目の例では、テンポラリ変数に呼び出しの結果を格納します。

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

参照

概念

データベース コードの分析によるコードの品質の向上