#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:
У меня было устаревшее приложение, подобное этому, это был кошмар.
Сначала я разбил его на несколько таблиц, все взаимно-однозначные. Это плохо, но не так плохо, как то, что у вас есть.
Затем я изменил запросы, чтобы запрашивать только те столбцы, которые действительно были необходимы. (Я не могу сказать, есть ли у вас такая опция.)