无法重建索引,因为行超出最大大小(Microsoft SQL)

无法重建索引,因为行超出最大大小(Microsoft SQL)

我正在尝试重建 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 的理解来看,这是不可能的。

如果我执行查询来检查行中有多少数据(即数据长度(col1)+数据长度(col2)...),那么表中最大的行似乎是 6389 字节,这与 8060 的限制相比是没问题的。

我尝试将表(使用导入导出向导)复制到另一个数据库或另一个服务器,但出现有关 8078 字节行的相同错误。

答案1

这篇文章有帮助吗?

建议创建一个新的 TEXT 列(不受行长度限制),将可变长度列复制到其中,删除旧列并运行DBCC 可清理. 对所有可变长度列执行此操作,然后将它们改回原来的状态。

答案2

似乎有些程序将空白放入文本字​​段中,而不是将其保留为空值,这是它应该做的。

解决方案是将数据复制到新表(使用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) 的存在。

相关内容