14

我创建了一个列类型为的表nvarchar(max),我的理解是它们可以支持 2GB。但是在插入时,我仍然收到此错误:

无法创建大于允许的最大行大小 8060 的大小为 8061 的行。

是否需要对数据库进行全局设置,还是我要达到另一个限制?varchar(max)每个表的字段数有限制吗?

4

3 回答 3

10

SQL Server 使用页面来存储数据。页面大小为 8kb。

因此 SQL Server 中的记录大小(行大小)不能大于 8060 字节。

如果数据不适合 8060 字节,则使用引用指针。 当 varchar、nvarchar、varbinary、sql_variant 或 CLR 用户定义类型列的组合超过此限制时,SQL Server 数据库引擎将具有最大宽度的记录列移动到 ROW_OVERFLOW_DATA 分配单元中的另一个页面,同时保持24-原始页面上的字节指针。

将大记录移动到另一个页面是动态发生的,因为记录基于更新操作而被延长。缩短记录的更新操作可能会导致记录移回 IN_ROW_DATA 分配单元中的原始页面。

此外,查询和执行其他选择操作,例如对包含行溢出数据的大型记录进行排序或连接会减慢处理时间,因为这些记录是同步处理的,而不是异步处理的。

使用稀疏列的表的记录大小限制为8,018 字节。当转换后的数据加上已有记录数据超过 8018 字节时,返回 MSSQLSERVER ERROR 576。在稀疏类型和非稀疏类型之间转换列时,数据库引擎会保留当前记录数据的副本。这会暂时使记录所需的存储空间增加一倍。.

要获取有关可能包含行溢出数据的表或索引的信息,请使用 sys.dm_db_index_physical_stats 动态管理函数。

于 2014-01-02T10:05:40.887 回答
3

从 SQL Server 文档:

对于 varchar、nvarchar、varbinary、sql_variant 和 CLR 用户定义类型列,各个列的长度仍必须在 8,000 字节的限制范围内。只有它们的组合长度可以超过表的 8,060 字节行限制。

其他数据类型列的总和,包括 char 和 nchar 数据, 必须在 8,060 字节的行限制之内。大对象数据也不受 8,060 字节行的限制。

更多信息在这里:https ://technet.microsoft.com/en-us/library/ms186981%28v=sql.105%29.aspx

于 2015-02-17T15:56:22.933 回答
0

这来自 StackOverflow 上的较早线程,可在此处找到:

无法创建大于允许的最大值 8060 的大小为 8937 的行

导致该错误的原因是 SQL Server 中的行不能大于 8KB(1 页大小),因为行不允许跨页 - 这是 SQL Server [...]

请注意,SQL Server 将允许您创建表,但是如果您尝试实际插入跨越多个页面的任何数据,则会出现上述错误。当然,这并没有完全加起来,因为如果以上是全部事实,那么单个 VARCHAR(8000) 列将填充表中的一行!(这曾经是这种情况)。SQL Server 2005 通过允许将行中的某些数据存储在另一个页面中,而不是保留一个 24 位指针来解决此限制。

我建议将您的表格规范化为一个或多个相关表格。

于 2013-10-08T17:10:39.113 回答