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(最大)列.有理由,主要不在我的控制之下,我不会进入这里.
解决方法
> 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))中选择一些更保守的估计值,但是您真的需要拆分一些这些领域分成不同的表格.