Превышен лимит размера строки SQL 2008 R2

#sql-server-2008-r2

#sql-server-2008-r2

Вопрос:

У меня есть база данных sql 2008 R2. Я создал таблицу, и при попытке выполнить для нее инструкцию select (с предложением order by) я получаю сообщение об ошибке «Не удается создать строку размером 8870, которая превышает допустимый максимальный размер строки 8060».

Я могу выбирать данные без предложения order by, однако предложение order by важно, и оно мне требуется. Я пробовал вариант НАДЕЖНОГО ПЛАНА, но по-прежнему получал ту же ошибку.

В моей таблице более 300 столбцов с типом данных TEXT. Я пытался использовать varchar и nvarchar, но безуспешно.

Может кто-нибудь, пожалуйста, дать некоторое представление?

Обновить:

Спасибо за комментарии. Я согласен. более 300 столбцов в одной таблице — не очень хороший дизайн. Что я пытаюсь сделать, так это перенести вкладки Excel в базу данных в виде таблиц данных. На некоторых вкладках более 300 столбцов.

Сначала я использую инструкцию CREATE для создания таблицы на основе вкладки Excel, поэтому столбцы различаются. Затем я выполняю различные инструкции SELECT, UPDATE, INSERT и т.д. В таблице после создания таблицы с данными.

Структура таблицы обычно соответствует этому шаблону: fkVersionID, RowNumber (автономер), Field1, Field2, Field3 и т.д…

есть ли какой-либо способ обойти ограничение размера строки 8060?

Комментарии:

1. более 300 столбцов с типом TEXT? Неужели? Похоже, что этой базе данных не помешала бы некоторая нормализация.

2. Не могли бы вы показать свой макет таблицы?

3. «Более 300 столбцов с типом данных TEXT». это просто очень плохой дизайн. ТЕКСТ не означает текст. Любая таблица с более чем приблизительно 100 столбцами является возможным кандидатом на разделение.

4. Вероятно, нет способа обойти ограничение таблицы 8060, но может быть другой способ выполнить то, что вы пытаетесь сделать с данными. Итак, что вы пытаетесь сделать с данными =)?

5. Подумайте об этом, если вам не нужно упорядочивать все 300 столбцов, вы могли бы сначала выполнить select только те столбцы, по которым планируете фильтровать / сортировать, затем присоединить результат обратно к исходной таблице и фактически выбрать все нужные вам столбцы. Может выполняться некорректно, но может работать.

Ответ №1:

Вы упомянули, что пробовали nvarchar и varchar … помните, что nvarchar удваивает используемые байты, но в некоторых случаях он единственный из двух поддерживает внешние символы, такие как знаки ударения.

varchar — хороший выбор, если вы можете соответствующим образом ограничить его максимальный размер. 8000 символов по-прежнему являются реальным пределом, но если в среднем каждый столбец varchar содержит не более 26 символов, все будет в порядке. Можно пойти рискованнее и использовать varchar и 50char длиной, но в среднем используется только 26 символов на столбец.. это означает, что один столбец может иметь длину 36 символов, а следующий — 16 символов … тогда все снова в порядке. (При условии, что вы никогда не превышаете среднее значение в 26 символов на столбец для 300 столбцов.)

Очевидно, что из-за динамического количества полей и потенциального превышения лимита в 8000 символов спецификации SQL обречены на это. Ваша единственная альтернатива — создать несколько таблиц и при доступе к данным иметь уникальный ключ для объединения соответствующих записей. Итак, в вашем операторе select используйте join, и из нескольких таблиц вы сможете обрабатывать строки с 8000 8000 …

Итак, это выполнимо, но вам придется работать с правилами SQL.

Ответ №2:

Я полагаю, вы столкнулись с этим ограничением:

Количество элементов в предложении ORDER BY не ограничено. Однако для размера строки промежуточных рабочих таблиц, необходимых для операций сортировки, существует ограничение в 8060 байт. Это ограничивает общий размер столбцов, указанных в предложении ORDER BY.

Комментарии:

1. @Mitch Wheat: Это утверждение не совсем верно. По крайней мере, в документации для SQL Server 2008 говорится: «SQL Server поддерживает хранилище с переполнением строк, которое позволяет удалять столбцы переменной длины за пределы строки. В основной записи для столбцов переменной длины, вытесненных из строки, хранится только 24-байтовый корневой файл; из-за этого эффективный предел строк выше, чем в предыдущих версиях SQL Server. Дополнительные сведения см. в разделе «Данные, превышающие 8 КБ при переполнении строк» в онлайн-книгах по SQL Server.»

2. Что мы пытаемся сделать, так это перенести tab из Excel в базу данных в виде таблиц. На некоторых вкладках более 300 столбцов. Я согласен с R0MANARMY в том, что размер строки промежуточных таблиц вызывает мою проблему, но есть ли способ обойти это?

Ответ №3:

У меня было устаревшее приложение, подобное этому, это был кошмар.

Сначала я разбил его на несколько таблиц, все взаимно-однозначные. Это плохо, но не так плохо, как то, что у вас есть.

Затем я изменил запросы, чтобы запрашивать только те столбцы, которые действительно были необходимы. (Я не могу сказать, есть ли у вас такая опция.)