我正在尝试重建 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
答案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) 的存在。