現象
アサーション エラーは、Microsoft SQL Serverが次を実行するストアド プロシージャを繰り返し実行するときに発生する可能性があります。
- varchar(max) や varbinary(max)などの大きなオブジェクトを引数として受け取り、
- プロシージャの実行をスコープとする一時テーブルを作成します。
- 一時テーブルのラージ オブジェクト引数を使用します。
次のようなアサーション エラーがSQL Serverエラー ログに表示される場合があります。
日付/時刻 SPID エラー: 17065、重大度: 16、状態: 1。
日付/時刻 SPID SQL Server アサーション: File: FilePath\FileName, line = LineNumber Failed Assertion = 'fFalse' 期限切れの BLOB ハンドルへのアクセスを試みます (1)。 このエラーはタイミングに関連している可能性があります。 ステートメントの再実行後もエラーが解決しない場合は、DBCC CHECKDB を使用してデータベースの構造整合性をチェックするか、サーバーを再起動してメモリ内のデータ構造が破損しないようにします。
日付/時刻 SPID エラー: 3624、重大度: 20、状態: 1。
日付/時刻 SPIDシステム アサーション チェックが失敗しました。 詳細については、SQL Serverエラー ログを確認してください。 通常、アサーションエラーはソフトウェアのバグまたはデータの破損によって発生します。 データベースの破損をチェックするには、DBCC CHECKDB の実行を検討してください。 セットアップ中に Microsoft にダンプを送信することに同意した場合は、ミニ ダンプが Microsoft に送信されます。 更新プログラムは、最新の Service Pack またはテクニカル サポートの修正プログラムで Microsoft から入手できる場合があります。
原因
SQL Serverには、大規模なオブジェクトを参照するクエリのキャッシュを無効にする内部ロジックがあり、後続の実行でこれらの LOB が参照されないようにします (これは前の実行時に作成されたため、後続の実行では無効です)。 そのロジックでは、これらのプランがキャッシュされる原因となった一時テーブルの 遅延名前解決 (DNR) のケースは処理されませんでした。 スコープ付き一時テーブルは作成にコストがかかり、SQL Serverは後続の実行で再利用するためにキャッシュします。 これにより、スキーマの変更により、このようなクエリの再コンパイルが防止されます。
遅延名前解決の詳細については、こちらをご覧ください。
解決策
この問題は、SQL Serverの次の累積的な更新プログラムで修正されています。
SQL Server 2016 SP1 の累積的な更新プログラム 8
SQL Server 2017 の累積的な更新プログラム 4
SQL Server 2014 Service Pack 2 の累積的な更新プログラム 10
SQL Server 用の累積的な更新プログラムについて
SQL Server 用の新しい累積的な更新プログラムには、以前のビルドであったすべての修正プログラムとセキュリティ修正プログラムが含まれます。 SQL Serverの最新の累積的な更新プログラムを確認してください。
SQL Server 2016 の最新の累積的な更新プログラム
SQL Server 2017 の最新の累積的な更新プログラム
SQL Server 2014 の最新の累積的な更新プログラム
状態
Microsoft は、これが "適用対象" セクションに記載されている Microsoft 製品の問題であることを確認しました。
参考資料
Microsoft がソフトウェア更新プログラムの説明に使用する 用語 について説明します。