この問題は、クラスタリングキーを更新しているという事実に関連しており、宛先テーブルにはたまたまパーティション分割スキーマがある1。SQL Serverがクラスタリングキーの任意のコンポーネントを更新するように要求された場合、UPDATE
and DELETE
、またはハイブリッド更新を実行する必要があり、一部の行はインプレースで更新され、一部は更新されません。
宛先テーブルからクラスター化インデックスを削除すると、更新が機能することがわかります。
エラーメッセージは、少し誤解を招く可能性がありますが、更新中に生成される行サイズが最大長を超えるため、正確です。
テーブルの構造を次のように変更することを検討することをお勧めします。
VARCHAR(MAX)
それらすべての列には使用しないでください。単一の列に実際に2GBの文字が必要ない場合、なぜそのように列を定義するのですか?現実的に遭遇する最大サイズになるように列を定義します。
- このテーブルをいくつかのテーブルに分割して、結果の最大行サイズが8060バイト未満になる可能性があります。あなたのような列のいくつかの論理クラスタ、持っているようだ
V_MAX_xxx
、V_64_xxx
とV_512_xxx
などの列を、
再現を簡単にするために、カーソルを削除して、次のDML操作のみを実行することができます。
UPDATE dbo.TBL_BM_HSD_SUBJECT_AN_148_REPRO_TARGET
SET [sampletime] = '2015-12-29 01:11:26.687';
上記の列は、クラスタリングキーおよびパーティション化キーのコンポーネントの1つです(他のCIキー列の更新は正常に機能します)。
クラスター化インデックスを配置すると、次のエラーが発生します。
メッセージ511、レベル16、状態1、行1
許容最大行サイズ8060より大きいサイズ8287の行は作成できません。
ステートメントは終了されました。
クラスタ化インデックスがない場合、ステートメントは成功します。
1興味深いことに、再現からパーティションを削除すると、クラスター化インデックスが配置されていても、更新が成功することがわかります。