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