現象
Microsoft SQL Server が、次の操作を実行するストアドプロシージャを繰り返し実行すると、アサーションエラーが発生することがあります。
-
Varchar (max) 、 varbinary (max)などの大きなオブジェクトを引数として受け取り、
-
プロシージャの実行に対してスコープが適用される一時的なテーブルを作成します。
-
テンポラリテーブルのラージオブジェクトの引数を使用します。
SQL Server エラーログに次のようなアサーションエラーが表示されることがあります。
日付/時刻 SPIDエラー: 17065、重大度:16、状態: 1。
日付/時刻 SPID SQL Server Assertion: 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 (以降の実行では無効) が参照されません。 このロジックでは、これらのプランがキャッシュされる原因となった一時テーブルの 遅延名前解決(入れ) のケースが処理されなかった。 スコープ指定された一時テーブルは作成コストが高く、SQL Server は以降の実行で再利用するためにそれらをキャッシュします。 これにより、スキーマが変更したために、このようなクエリのリコンパイルが行われなくなります。
遅延名前解決の詳細については、こちらを参照してください。
解決方法
この問題は、SQL Server の次の累積的な更新プログラムで修正されています。
SQL Server 2016 SP1 の累積更新プログラム8
SQL Server 2014 Service Pack 2 の累積更新プログラム 10
SQL Server 向けの新しい累積的な更新プログラムには、以前のビルドで使用されていたすべての修正プログラムとセキュリティの修正が含まれています。 SQL Server の最新の累積的な更新プログラムを確認します。
SQL Server 2016 の最新の累積的な更新プログラム
SQL Server 2017 の最新の累積的な更新プログラム
SQL Server 2014 の最新の累積的な更新プログラム
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
関連情報
Microsoft でソフトウェアの更新について説明する 用語 について説明します。