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

Sim*_*ams 18 sql-server

我们在数据库中的表上收到此错误:

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

该表包含大约400个varchar(max)字段.但是,我们只在这些字段中插入空字符串.

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

它只发生在一个特定的varchar(max)而不是其他特定的(2005 Express).问题机器正在运行SqlXml,其他机器正在运行DBCC DBREINDEX.

有没有人对此有任何想法?如果我需要提供更多信息,请告诉我.


阅读了一些你的回复之后,我想指出我完全同意,尝试使用这么多varchar(max)列是非常极端的,不寻常的并且一点也不明智.有理由,主要不在我的控制之下,我不会进入这里.

Jus*_*tin 18

导致该错误是因为您不能在SQL服务器中有一行大于8KB(大小为1页)的行,因为不允许行跨越页面 - 这是SQL Server的基本限制,您可以在此处阅读更多相关信息:

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

当然这并没有完全相加,因为如果以上是全部真相那么单列VARCHAR(8000)将在表中填充一行!(过去就是这种情况).SQL Server 2005通过允许来自行的某些数据存储在另一个页面中而改为保留24字节指针来解决此限制.你可以在这里阅读:

正如您所看到的,现在意味着行现在可以跨越多个页面,但是单列行仍然需要适合单个页面(因此列的最大大小VARCHAR(8000))并且此类列的总数仍然存在限制你可以拥有(估计大约8000/24 = ~300)

当然这一点都缺少了主要观点,即单个表上的400个宽列是荒谬的!

你应该仔细研究一下你的数据库模式并提出一些更合理的东西 - 你可以从选择一些更保守的列大小估计(比如VARCHAR(255)VARCHAR(50))开始,但你真的需要将其中的一些字段拆分成单独的表.


Mar*_*ith 9

您可能在表中删除了仍占用空间的列.另外检查"文本在行"设置是否相同.