RuleId |
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