現象
Transact-SQL で実装され、1 つのデータ値を返す User-Defined 関数 (UDF) は、T-SQL スカラー User-Defined 関数 (UDF) と呼ばれます。
スカラー UDF インライン化機能は、Microsoft SQL Server 2019 で導入されました。 この機能により、UDF の実行がボトルネックである T-SQL スカラー UDF を呼び出すクエリのパフォーマンス メインが向上します。 T-SQL スカラー UDF インライン化では、インライン化可能な UDF が自動的にリレーショナル式に変換されます。
この累積的な更新プログラム (CU) には、スカラー UDF インライン化を使用するクエリがエラー メッセージまたは予期しない結果を返す可能性があるシナリオについて、次の領域にわたっていくつかの 修正が 含まれています。
-
UDF の戻り値の型が sql_variant である場合は、型の不一致エラーが発生します (SQL Server 2019 CU2 で追加)。
-
sp_executesqlからの UDF 呼び出しは実行を取り消します (SQL Server 2019 CU2 で追加)。
-
関連付けられた GOTO コマンドを使用せずにラベルを参照する UDF は、正しくない結果を返します (SQL Server 2019 CU2 で追加)。
-
メモリ不足状態とメモリ リークは、スカラー UDF が非常に大きいために発生します (SQL Server 2019 CU2 で追加)。
-
条件 (IF-ELSE) ステートメントで使用される初期化されていない変数では、エラーが発生します (SQL Server 2019 CU2 で追加)。
-
UDF に sql_variantパラメーター (2019 CU7 SQL Serverで追加) がある場合、明示的な変換エラーが発生します。
-
スカラー関数が CHECKSUMを参照している場合にエラーが発生します (SQL Server 2019 CU7 で追加)。
-
スカラー式の再評価が多い UDF 呼び出しでは、非生成スケジューラ エラーが発生する可能性があります (SQL Server 2019 CU7 で追加)。
注: この問題の修正により、パフォーマンスが低下することがあります。 このパフォーマンス低下を軽減するには、トレース フラグ (TF) 13156 をオンにすることで、元の修正プログラムを無効にすることができます。
Microsoft では、将来の CU で使用できるこのパフォーマンス回帰の修正に取り組んでいます。
-
UDF 参照クエリで OPTION (RECOMPILE)が使用されている場合にエラーが発生します (SQL Server 2019 CU7 で追加)。
-
アクセス許可エラーは、ビューがインライン UDF を呼び出す場合に発生します (SQL Server 2019 CU9 で追加)。
-
アクセス違反は、query_tsql_scalar_udf_inlinedXEvent が使用されている場合に発生します (SQL Server 2019 CU9 で追加)。
-
一貫性のない動作が発生するのは、スカラー UDF インライン化が QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_nクエリ ヒント (SQL Server 2019 CU9 に追加) を考慮していないためです。
-
インライン化 UDF には、生成されていないスケジューラ エラーを引き起こす可能性がある集計が含まれています (SQL Server 2019 CU9 で追加)。
-
メモリ不足エラーは、条件付きブロック内の同じ変数に対する一連のスカラー操作が原因で発生します (SQL Server 2019 CU9 で追加)。
-
CU9 にアップグレードすると、入力パラメーター (2019 CU11 で追加) として使用されるスカラー インライン化可能 UDF (UDF2) を持つスカラー インライン化可能 UDF (UDF1) がオブジェクトによって呼び出されると、アクセス違反 SQL Serverが発生します。
-
インライン化 UDF はエラーを引き起こし、エラー コード 6846、1011、107 (SQL Server 2019 CU11 で追加) を生成する可能性があります。
-
sysadmin 以外のアカウントとして実行されるインライン化 UDF は、"現在のコマンドで重大なエラーが発生しました" というエラー メッセージを返す場合があります。 結果がある場合は破棄する必要があります" (SQL Server 2019 CU16 で追加)。
-
アクセス違反は、シノニム (Microsoft SQL Server 2022 CU1 および SQL Server 2019 CU19 で追加) を使用して UDF 内で一時テーブルが呼び出された場合に発生します。
-
アクセス違反は、UDF 定義に GOTO ラベルとRETURN ステートメントのみが含まれている場合に発生します (SQL Server 2022 CU1 および SQL Server 2019 CU19 で追加)。
-
スカラー UDF は、スカラー UDF インライン化機能がオンになっているとき (2022 CU3 および SQL Server SQL Server 2019 CU20 で追加) 異なる日付と時刻の形式で結果を返します。
-
ダンプの問題は、 GROUP BY 句でインライン UDF を使用しているが、集計関数 (SQL Server 2022 CU12 で追加) を使用していない場合に発生します。
-
エラー "最大ストアド プロシージャ、関数、トリガー、またはビューの入れ子レベルを超えました (制限 32)"は、入れ子のレベルが (SQL Server 2022 CU12 で追加) を超えない場合でもスカラー UDF インライン化機能が有効になっている場合に発生します。
-
スカラー UDF インライン化機能が有効になっている場合 (SQL Server 2022 CU12 で追加) すると、 sqllang.dll!CProchdr::FDeriveInlineabilityOfScalarUdf でメモリ破損が発生します。
この累積的な更新プログラムは、次のシナリオでもインライン展開を ブロックします。
-
UDF が特定の組み込み関数 (たとえば、 @@ROWCOUNT) を参照している場合、UDF がインライン化されるときに結果が変更される可能性があります (SQL Server 2019 CU2 で追加)。
-
集計関数がスカラー UDF にパラメーターとして渡される場合 (SQL Server 2019 CU2 で追加)。
-
UDF が組み込みビュー (例: OBJECT_ID) を参照している場合 (SQL Server 2019 CU2 で追加)。
-
UDF で XML メソッドが使用されている場合 (SQL Server 2019 CU4 で追加)。
-
UDF に、ORDER BY句を使用するが TOP 1しない SELECTステートメントが含まれている場合 (SQL Server 2019 CU4 で追加)。
-
SELECT ステートメントが ORDER BY 句 ( SELECT @x = @x +1 FROM table ORDER BY column_nameなど) と共に割り当てを実行する場合 (SQL Server 2019 CU4 で追加)。
-
UDF に複数の RETURN ステートメントが含まれている場合 (SQL Server 2019 CU5 で追加)。
-
UDF が RETURN ステートメントから呼び出された場合 (SQL Server 2019 CU5 で追加)。
-
UDF が STRING_AGG 関数を参照している場合 (SQL Server 2019 CU5 で追加)。
-
UDF 定義がリモート テーブルを参照している場合 (SQL Server 2019 CU6 で追加)。
-
UDF 呼び出し元のクエリで GROUPING SETS、 CUBE、または ROLLUP を使用する場合 (SQL Server 2019 CU6 で追加)。
-
UDF 呼び出し元のクエリに、割り当てに UDF パラメーターとして使用される変数 ( SELECT @y=2, @x=UDF(@y)など) が含まれている場合 (SQL Server 2019 CU6 で追加)。
-
UDF が暗号化された列を参照している場合 (SQL Server 2019 CU11 で追加)。
-
UDF に WITH XMLNAMESPACESへの参照が含まれている場合 (SQL Server 2019 CU11 で追加)。
-
UDF を呼び出すクエリに共通テーブル式 (CTE) がある場合 (SQL Server 2019 CU11 で追加)。
-
UDF 定義に一時テーブルまたは一時テーブルのシノニムが含まれている場合 (SQL Server 2022 CU1 および SQL Server 2019 CU19 で追加)。
-
UDF 定義に複数の割り当て列に対するDISTINCT句と共にSELECTステートメントがある場合 (2022 CU4 および SQL Server 2019 CU20 に追加SQL Server)。
-
UDF に、 TABLESAMPLE PERCENT 句と複数の変数割り当てを使用する SELECT ステートメントが含まれている場合 (SQL Server 2022 CU7 で追加)。
-
UDF を含むインデックス付きビューによって参照されているテーブルに INSERT クエリが存在する場合 (SQL Server 2022 CU12 で追加)。
SQL Server 2019 CU2 にアップグレードした後、2019 CU5 SQL Serverにアップグレードする前に、UDF がインライン化の対象かどうかを再評価する必要があります。 これを行うには、次のいずれかの方法で適格なスカラー UDF を更新します。
-
該当するスカラー UDF に対して sp_refreshsqlmodule を実行します。 このシステム ストアド プロシージャの詳細については、「sp_refreshsqlmodule (Transact-SQL)」を参照してください。
-
既存の定義、アクセス許可、およびプロパティの設定を使用して、既存のスカラー UDF を変更または再作成します。 詳細については、「 ALTER FUNCTION (Transact-SQL)」を参照してください。
次のコマンドは、既存のインライン化されたスカラー UDF のメタデータを更新するスクリプトを生成します。
/*
Generates a script that can be used to refresh all active inlineable scalar UDFs.
Note The sp_refreshsqlmodule command does not affect any permissions, extended properties, or SET options that are associated with the object.
*/
SELECT 'EXECUTE sys.sp_refreshsqlmodule ''[' + OBJECT_SCHEMA_NAME(object_id) + +'].' + '[' + OBJECT_NAME(object_id)
+ ']'';' AS 'RefreshStatement'
FROM sys.sql_modules
WHERE is_inlineable = 1
AND inline_type = 1;
GO
注: SQL Server 2019 CU5 にアップグレードすると、コンパイル中に UDF のインライン化が自動的に再開されます。
解決方法
この問題は、SQL Serverの次の累積的な更新プログラムで修正されています。
SQL Serverの各新しい累積的な更新プログラムには、すべての修正プログラムと、以前の累積的な更新プログラムに含まれていたすべてのセキュリティ修正プログラムが含まれています。 SQL Serverの最新の累積的な更新プログラムを確認してください。
状態
Microsoft は、これが Microsoft 製品の問題であることを確認しました。この問題は、"適用対象" セクションに記載されています。
関連情報
マイクロソフトでソフトウェア更新プログラムの説明に使用する用語集を参照してください。