我们在数据库中的表上收到此错误:
无法创建大小为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))开始,但你真的需要将其中的一些字段拆分成单独的表.