sql-server – 不能创建一个大小为8937的行,大于允许的最大值8060

前端之家收集整理的这篇文章主要介绍了sql-server – 不能创建一个大小为8937的行,大于允许的最大值8060前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们在数据库中的表上收到此错误

Cannot create a row of size 8937 which is greater than the allowable
maximum of 8060.

该表由约400个varchar(max)字段组成.但是,我们只将空字符串插入到这些字段中.

插入似乎工作,但是当使用sqlXml读取数据或在表的主键上运行DBCC DBREINDEX时,会发生错误.

它只发生在一个特定的sql Server(2005)而不是其他(2005 Express)上.问题机器正在运行64位Windows,而其他机器正在运行32位窗口.

有人有任何想法吗?如果我需要包含更多信息,请通知我.

阅读了您的一些回应后,我想指出,我完全同意,这是非常非常,不寻常的,甚至没有任何理由尝试使用这个许多varchar(最大)列.有理由,主要不在我的控制之下,我不会进入这里.

解决方法

错误是由于不能在sql Server中大于8KB(大小为1页)的行,因为行不允许跨页 – 它是sql Server的基本限制,您可以在此处阅读更多信息:

> Database Basics Quick Note – The difference in Varchar and Nvarchar data types

请注意,sql服务器将允许您创建表,但是如果您尝试实际插入跨多个页面的数据,那么它将给出上述错误.

当然这并不完全相同,因为如果以上是真相,那么单个VARCHAR(8000)列会在表中填满一行! (以前是这种情况). sql Server 2005解决了这一限制,允许将一行中的某些数据存储在另一个页面中,而不是使用24位指针.你可以在这里阅读:

> How Sql Server 2005 bypasses the 8KB row size limitation
> Maximum Row Size in SQL Server 2005 to the Limit

现在可以看到,这意味着行现在可以跨多个页面,但单列行仍然需要适合单个页面(因此列的最大大小为VARCHAR(8000)),并且总共仍然有一个限制你可以拥有这样的列数(约8000/24 =我估计约300)

当然,这一切都是缺点的一个主要问题,那就是一张桌子上的400个宽柱是荒谬的!

您应该对数据库模式进行长时间的考察,并提出更合理的方法 – 您可以从列大小(如VARCHAR(255)或VARCHAR(50))中选择一些更保守的估计值,但是您真的需要拆分一些这些领域分成不同的表格.

猜你在找的MsSQL相关文章