0

XML私たちのデータベースには、データ型の列を持つテーブルがあります。列は必須 ( not null) でしたが、非必須 ( ) にする必要がありましたnull。次のようなスクリプトを作成しました。

alter table [SomeSchema].[SomeTable] alter column [SomeColumn] XML null

ロールバック スクリプトを作成/テストする必要があったため、次のようなスクリプトを作成しました。

alter table [SomeSchema].[SomeTable] alter column [SomeColumn] XML not null

最初のステートメントは正しく実行されました。ロールバックをテスト/実行しようとすると、次のエラーが発生しました。

メッセージ 511、レベル 16、状態 1、行 1
サイズ 8082 の行を作成できません。行の許容最大サイズ 8060 を超えています。ステートメントは終了しました。

この問題は、おそらく XML 型には適用されないはずの行オーバーフローに関連しているようです (ただし、この状況では適用されるようです)。この問題は、特定のレコードがテーブルにある (つまり、データの影響を受ける) 場合にのみ発生しますが、データのサイズに直接相関しているようには見えません。たとえば、あるレコードの XML の長さは 10,473 文字で、この問題が発生しました。別のレコードの XML の長さは 159,072 文字で、問題は発生しませんでした。

設定:

  • Windows XP SP3
  • SQL Server 2008 R2
4

1 に答える 1

0

私たちの常駐DBの第一人者は、問題を解決するためのコードを見つけることができましたが(以下を参照)、なぜこれが発生したのか/必要なのかを説明することはできません. 8060 バイトより小さい XML は行内に格納され、より大きな XML は LOB ストレージに格納され、[非]必須の制約を何らかの形で適用すると、行サイズがこの制限を超えて増加するのではないかと考えています。しかし、SQL Server はこれを適切に処理していません。次の点についてはまだ途方に暮れています。

  • 実際に何が起こっているのか
  • なぜこのエラーが発生するのか (SQL Server のバグ? 悪い習慣?)
  • すでに 8k を超えている一部のレコードでこれが発生する理由

どんな説明でも大歓迎です!

exec sp_tableoption '[SomeSchema].[SomeTable]', '行外の大きな値の型', 1;
行く

テーブルを変更 [SomeSchema].[SomeTable] 制約を削除 [ThePKConstraint]
行く

テーブルを変更 [SomeSchema].[SomeTable] 制約を追加 [ThePKConstraint] クラスター化された主キー
(
      [SomeIDColumn] asc,
      [SomeOtherIDColumn] asc
)
行く
于 2012-10-03T06:25:05.810 に答える