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

时间:2010-10-11 11:55:45

标签: sql-server sql-server-2005 database-design

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

  

无法创建大于8937的行大于允许的行   最多8060。

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

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

它只发生在一个特定SQL Server (2005)而不发生在其他{2005}上。问题机器正在运行64-bit Windows,其他问题正在运行32-bit windows

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


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

4 个答案:

答案 0 :(得分:18)

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

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

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

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

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

您应该仔细查看数据库架构并提出更合理的建议 - 您可以先选择一些更为保守的列大小估算值(例如VARCHAR(255)VARCHAR(50)),但你真的需要将其中的一些字段分成不同的表格。

答案 1 :(得分:9)

表中可能还有a deleted column仍然占用空间。另外检查“行中文本”设置是否相同。

答案 2 :(得分:2)

行大小取决于列的类型,而不是您存储的数据量。

在一个表中有400个varchar字段告诉我你做错了什么。也许您需要normalize架构?

答案 3 :(得分:0)

我今天有这个问题。但是此表的列很小,只有几百行。而且这张桌子以前工作得很好。我花了很多时间研究。

最后,我备份此表数据。我删除表格。并创建相同的新表;然后还原数据。一切都好。

它显示旧桌子可能在里面撞了。可能是SQL Server错误。无论如何,问题解决了。希望节省别人的时间。

背景:MS SQL 2012