Невозможно создать строку размера 8937, которая больше допустимого максимума 8060

Мы получаем эту ошибку на таблицу в нашей базе данных:

Невозможно создать строку размером 8937, которая превышает допустимый максимум 8060.

Таблица состоит из около 400 полей varchar(max). Мы, однако, только вставляем пустые строки в эти поля.

Кажется, вставка работает, но при использовании SqlXml для чтения данных или при запуске DBCC DBREINDEX для первичного ключа таблицы возникает ошибка.

Это происходит только на одном конкретном SQL Server (2005), а не на других (2005 Express). На проблемном компьютере установлена 64-разрядная Windows, а на других - 32-разрядные.

У кого-нибудь есть идеи по этому поводу? Пожалуйста, дайте мне знать, если мне нужно добавить дополнительную информацию.

Я хотел бы отметить, что я полностью согласен с тем, что довольно сложно, необычно и совсем не разумно пытаться использовать это множество столбцов varchar (max). Для этого есть причины, в основном не под моим контролем, которые я не буду здесь вдаваться.

Ответ 1

Ошибка вызвана тем, что на сервере SQL не может быть строки размером более 8 КБ (размер 1 страницы), поскольку строки не могут занимать страницы - это основной предел SQL Server, вы можете прочитать об этом здесь:

Обратите внимание, что SQL-сервер позволит вам создать таблицу, однако, если вы попытаетесь фактически вставить какие-либо данные, которые занимают несколько страниц, это вызовет вышеуказанную ошибку.

Конечно, это не совсем суммируется, потому что если все вышесказанное было полной правдой, то один столбец VARCHAR(8000) заполнил бы строку в таблице! (Это было так). SQL Server 2005 обошел это ограничение, разрешив хранить определенные данные из строки на другой странице, и вместо этого оставил вместо него 24-байтовый указатель. Вы можете прочитать об этом здесь:

Как вы можете видеть, теперь это означает, что строки теперь могут занимать несколько страниц, однако строки одного столбца по-прежнему должны помещаться на одной странице (следовательно, максимальный размер столбца составляет VARCHAR(8000)), и общее количество по-прежнему ограничено. количество таких столбцов, которые вы можете иметь (около 8000/24 = ~ 300 по моей оценке)

Конечно, все это упускает главное, что 400 широких столбцов в одной таблице абсурдно !!!

Вам следует внимательно взглянуть на схему базы данных и придумать что-то более разумное - вы могли бы начать с выбора более консервативных оценок размеров столбцов (таких как VARCHAR(255) или VARCHAR(50)), но вам действительно нужно разделить некоторые из этих полей разбиты на отдельные таблицы.

Ответ 2

У вас может быть удаленный столбец в таблице, который все еще занимает место. Также проверьте, что настройки "текст в строке" одинаковы.

Ответ 3

Размер строки определяется типами столбцов, а не количеством хранимых в них данных.

У вас 400 полей varchar в одной таблице говорит мне, что вы делаете что-то неправильно. Возможно, вам нужно нормализовать схему?

Ответ 4

Разделите таблицу на несколько.

Ответ 5

У меня есть эта проблема сегодня. но этот столбец таблицы маленький и содержит только сотни строк. и эта таблица хорошо работает раньше. Я потратил много времени на исследования.

наконец, я делаю резервную копию этой таблицы данных. Я удаляю таблицу. и создать такую же новую таблицу; затем восстановить данные. все отлично.

Это показывает, что старая таблица может быть разбита внутри. возможно ошибка сервера SQL. во всяком случае, проблема ушла. надеюсь сэкономить время других.

фон: MS SQL 2012