Я пытаюсь перестроить кластерный индекс в таблице 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, это невозможно.
Если я сделаю запрос, чтобы проверить, сколько данных находится в строках (например, Datalength (col1) + datalength (col2) ...), то самая большая строка в таблице будет иметь размер 6389 байтов, что нормально по отношению к Лимит 8060.
Я попытался скопировать таблицу (с помощью мастера импорта и экспорта) в другую базу данных или на другой сервер и получаю те же ошибки в строке размером 8078 байт.
Делает этот пост поможет?
Предлагается создать новый столбец ТЕКСТ (который не подлежит ограничению длины строки), скопировать в него столбец переменной длины, отбросив старый столбец и запустив DBCC CLEANTABLE. Сделайте это для всех столбцов переменной длины, затем верните их в прежнее состояние.
Похоже, что какая-то программа вставляла пробелы в текстовые поля вместо того, чтобы оставлять их как пустые, что она и должна была делать ..
Решением было скопировать данные в новую таблицу (используя 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).