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

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

Я могу выбрать данные без предложения order by, однако предложение order by важно, и я требую его. Я попробовал параметр ROBUST PLAN, но я все же получил ту же ошибку.

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

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

Обновление

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

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

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

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

Ответ 1

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

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

Очевидно, что с динамическим числом полей и потенциалом к ​​превышению предела 8000 символов он обречен на спецификации SQL. Единственная другая альтернатива - создать несколько таблиц, а при доступе к данным - уникальный ключ для присоединения соответствующих записей. Поэтому в вашем заявлении select используйте соединение, и из нескольких таблиц вы можете обрабатывать строки с 8000 + 8000 +...

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

Ответ 2

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

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

Ответ 3

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

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

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