Назад | Перейти на главную страницу

Невозможно перестроить индекс, поскольку строка превышает максимальный размер (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, это невозможно.

Если я сделаю запрос, чтобы проверить, сколько данных находится в строках (например, 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).