今週、SQL2014 SP2 CU11サーバー上のデータベースが、FETCHコードステートメントで致命的なエラー(重大度20)をスローし始めました。これは、次のように減らすことができます。
DECLARE @dummy int
DECLARE CurName CURSOR LOCAL FOR
SELECT TOP (1) t.id FROM dbo.t_table AS t;
OPEN CurName;
WHILE 1 = 1
BEGIN
FETCH NEXT FROM CurName INTO @dummy;
IF @@fetch_status <> 0 BREAK;
PRINT @dummy
END;
DBCCCHECKTABLEおよびDBCCCHECKDBは問題を検出せず、サーバーの再始動は役に立ちませんでした(そして、同じデータベースの複数のバージョンで同時に発生したため、これがデータベース構造の問題である可能性はほとんどありませんでした)。
SQL2014 SP2とCU6のみを備えた開発サーバーでは、同じステートメントが問題なく実行されます(SQL2017サーバーでも機能します)。
テーブル
最初の解決策: CURSOR宣言をに変更したとき
DECLARE CurName CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR ...
(または少なくともSTATICキーワードを追加して)、正常に実行されます。
最終解決策:テーブルにはジオメトリと地理列があり、これらは今週末に削除されました(2つの対応する空間インデックスと共に)。
これがこのテーブルへの唯一の変更だったので、この問題を解決したクラスター化された主キーインデックスを再構築することにしました。
SQL2014のSP2CU11には、この特殊なケースで小さなバグがあるようです。したがって、同様の問題を抱えている人は、この解決策が役立つと思うかもしれません...