我创建了一个列类型为nvarchar(max)
的表,我的理解是它们可以支持2GB。但是在插入时,我仍然收到此错误:
无法创建大小为8061的行,该行大于允许的最大行大小8060.
是否需要对数据库进行全局设置,还是有其他限制?每个表的varchar(max)
字段数量是否有限制?
答案 0 :(得分:8)
SQL Server使用页面来存储数据。页面大小为8kb。
因此SQL Server中的记录大小(行大小)不能超过8060字节。
如果数据未安装在8060字节中,则使用参考指针。 当varchar,nvarchar,varbinary,sql_variant或CLR用户定义类型列的组合超出此限制时,SQL Server数据库引擎将具有最大宽度的记录列移动到ROW_OVERFLOW_DATA分配单元中的另一个页面,同时保持 24字节指针。
根据更新操作延长记录,动态发生将大型记录移动到另一个页面。缩短记录的更新操作可能会导致记录移回IN_ROW_DATA分配单元中的原始页面。
此外,查询和执行其他选择操作(例如对包含行溢出数据的大型记录进行排序或连接)会减慢处理时间,因为这些记录是同步处理而不是异步处理。
使用稀疏列的表的记录大小限制为8,018字节。当转换的数据加上现有记录数据超过8,018字节时,将返回MSSQLSERVER ERROR 576。在稀疏类型和非稀疏类型之间转换列时,数据库引擎会保留当前记录数据的副本。这会暂时使记录所需的存储空间翻倍。 。
要获取有关可能包含行溢出数据的表或索引的信息,请使用sys.dm_db_index_physical_stats动态管理功能。
答案 1 :(得分: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
答案 2 :(得分:0)
这来自StackOverflow上的早期帖子,可以在这里找到:
Cannot create a row of size 8937 which is greater than the allowable maximum of 8060
导致错误是因为SQL服务器中的行不能超过8KB(1页的大小),因为不允许行跨页 - 这是SQL Server的基本限制[...] < / p>
请注意,SQL Server将允许您创建表,但是如果您尝试实际插入跨越多个页面的任何数据,那么它将给出上述错误。 当然这并没有完全相加,因为如果以上是全部真相,那么单个VARCHAR(8000)列将填充表中的一行! (过去就是这种情况)。 SQL Server 2005通过允许来自行的某些数据存储在另一个页面中而改为保留24位指针来解决此限制。
我建议将您的表规范化为一个或多个重新关联的表。