列タイプが のテーブルを作成しましたが、nvarchar(max)
2GB をサポートできると理解しています。ただし、挿入すると、次のエラーが表示されます。
許容最大行サイズ 8060 より大きいサイズ 8061 の行を作成できません。
データベースに必要なグローバル設定はありますか、それとも別の制限がありますか? varchar(max)
テーブルあたりのフィールド数に制限はありますか?
列タイプが のテーブルを作成しましたが、nvarchar(max)
2GB をサポートできると理解しています。ただし、挿入すると、次のエラーが表示されます。
許容最大行サイズ 8060 より大きいサイズ 8061 の行を作成できません。
データベースに必要なグローバル設定はありますか、それとも別の制限がありますか? varchar(max)
テーブルあたりのフィールド数に制限はありますか?
SQL サーバーはページを使用してデータを格納します。ページサイズは8kbです。
そのため、SQL サーバーのレコード サイズ (行サイズ) は 8060 バイトを超えることはできません。
データが 8060 バイトに収まらない場合は、参照ポインターが使用されます。 varchar、nvarchar、varbinary、sql_variant、または CLR のユーザー定義型の列の組み合わせがこの制限を超えると、SQL Server データベース エンジンSQL Server Database Engine は、最大幅のレコード列を ROW_OVERFLOW_DATA アロケーション ユニット内の別のページに移動します。元のページのバイト ポインター。
大きなレコードの別のページへの移動は、更新操作に基づいてレコードが長くなるため、動的に行われます。レコードを短くする更新操作により、レコードが IN_ROW_DATA アロケーション ユニットの元のページに戻される場合があります。
また、行オーバーフロー データを含む大きなレコードに対して、並べ替えや結合などの他の選択操作をクエリおよび実行すると、これらのレコードが非同期ではなく同期で処理されるため、処理時間が遅くなります。
スパース列を使用するテーブルのレコード サイズの制限は 8,018 バイトです。変換されたデータと既存のレコード データが 8,018 バイトを超えると、MSSQLSERVER ERROR 576 が返されます。列がスパース型と非スパース型の間で変換されると、データベース エンジンは現在のレコード データのコピーを保持します。これにより、レコードに必要なストレージが一時的に 2 倍になります。.
行オーバーフロー データを含む可能性のあるテーブルまたはインデックスに関する情報を取得するには、sys.dm_db_index_physical_stats 動的管理関数を使用します。
これは、ここにある StackOverflow の以前のスレッドからのものです。
許容される最大値 8060 を超えるサイズ 8937 の行は作成できません
行がページにまたがることが許可されていないため、SQLサーバーに8KB(1ページのサイズ)を超える行を含めることができないため、エラーが発生します-これはSQLサーバーの基本的な制限です[...]
SQL サーバーではテーブルを作成できますが、複数のページにまたがるデータを実際に挿入しようとすると、上記のエラーが発生することに注意してください。もちろん、上記が完全に真実である場合、単一の VARCHAR(8000) 列がテーブルの行を埋めるため、これは完全には加算されません! (これは以前はそうでした)。SQL Server 2005 は、行の特定のデータを別のページに格納できるようにし、代わりに 24 ビット ポインターを残すことで、この制限を回避しました。
テーブルを 1 つ以上の関連テーブルに正規化することをお勧めします。