加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 08:42:19 所属栏目:MsSql教程 来源:网络整理
导读:我们在数据库中的表上收到此错误: Cannot create a row of size 8937 which is greater than the allowable maximum of 8060. 该表由约400个varchar(max)字段组成.但是,我们只将空字符串插入到这些字段中. 插入似乎工作,但是当使用SqlXml读取数据或在表的主
我们在数据库中的表上收到此错误:

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))中选择一些更保守的估计值,但是您真的需要拆分一些这些领域分成不同的表格.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读