由于超过最大大小的行(Microsoft SQL)无法重build索引

我试图重build一个SQL Server 2005表上的聚集索引,我不断收到错误:

Cannot create a row of size 8078 which is greater than the allowable maximum of 8060. 

该命令只是一个标准的ALTER INDEX <name> ON <table> REBUILD

我不知道如何设法将8078个字节放到一行中 – 从我对SQL的理解来看,这是不可能的。

如果我做了一个查询来检查在行中有多less数据(即Datalength(col1)+ datalength(col2)…),那么表中最大的一行显示为6389字节,这相对于8060限制。

我试图复制表(使用导入导出向导)到另一个数据库或另一台服务器,我得到了一个8078字节行相同的错误。

这篇文章有帮助吗?

build议创build一个新的TEXT列(不受行长度限制),将可变长度列复制到旧列中并运行DBCC CLEANTABLE 。 对所有可变长度的列执行此操作,然后将其更改回原来的样子。

看起来有些程序是在文本字段中input空格,而不是将它们作为空值,这是它应该做的。

解决方法是将数据复制到一个新的表(使用INSERT而不是SSIS),但在SELECT每个文本字段的条件如下所示:

 CASE datalength([col1]) WHEN 0 THEN NULL ELSE [col1] END AS [col1] 

这删除了空的文本字段解决了问题 – 显然,数据然后必须复制回来,但我可以做TRUNCATE TABLE [tablename]然后INSERT INTO [tablename] SELECT * FROM [copyoftable]

我想可能是时候向某些人解释varchar(MAX)的存在了。