2013-05-08 4 views
5

Во-первых, я знаю, что в целом наличие большого количества широких столбцов - плохая идея, но это формат, к которому я привязан.Есть ли способ ограничения длины строки 8k в SQL Server?

У меня есть приложение, которое импортирует CSV-файлы в промежуточную таблицу, прежде чем манипулировать ими и вставлять/обновлять значения в базе данных. Переменная таблица создается «на лету» и имеет переменное количество кодов NVARCHAR, в которые импортируется файл, плюс два столбца INT, используемые в качестве идентификаторов строк.

Один конкретный файл, который я должен импортировать, составляет около 450 колонок. С 24-байтовым указателем, используемым в большой колонке NVARCHAR, это составляет около 10 тыс. По моим расчетам, и я получаю ошибку Cannot create a row of size 11166 which is greater than the allowable maximum row size of 8060.

Есть ли способ обойти это или мои варианты выбора, изменяющие импортер для разделения импорта или удаление столбцов из файла?

+0

Взгляните на SSIS. http://www.microsoft.com/en-us/sqlserver/solutions-technologies/enterprise-information-management/integration-services.aspx Это позволит вам читать в CSV и фильтровать и отделять строки от разных целевых таблиц. – flup

+3

Ни в коем случае. Если вы на самом деле создаете строку + 8k даже после высечки за пределами строки, вам не повезло. –

+1

Создайте две или более таблицы и вставьте 450 столбцов, разделенных вокруг этих таблиц, связанных с ключами. – Max

ответ

1

Если вы используете SQL Server 2005, 2008 или 2012, вы должны иметь возможность использовать NVARCHAR (max) или NTEXT, размер которых превышает 8000 символов. MAX даст вам 2^31 - 1 символов:

http://msdn.microsoft.com/en-us/library/ms186939(v=sql.90).aspx

+0

Я использовал вариант этого. Проблема заключалась в том, что количество столбцов было слишком много, а 24 байтовых указателя были слишком многочисленны для ограничения строки. Я импортировал как один столбец NVARCHAR (MAX), затем разделил его на манипуляции – Jaloopa

+0

NVARCHAR (max), или NTEXT может хранить данные более 8 КБ, но размер записи не может превышать 8 кбайт до SQL Server 2012. Если данные не установлены в размере страницы 8kb, то данные большего столбца перемещаются на другую страницу, а указатель-указатель в главном столбце используется как 24-байтовый (если тип данных является varchar/nvarchar). если это текстовый/ntext-тип данных, то используется 16 байтов. –

3

Вы можете использовать текст/NTEXT, который использует указатель 16 байт. В то время как varchar/nvarchar использует указатель 24 байта.

NVARCHAR (макс) или NTEXT может хранить данные более чем 8kB но размер записи не может быть больше, чем 8kb до SQL Server 2012. Если данные не установлены в 8KB размера страницы то данные о большей колонке перемещаются на другую страницу и 24 байта (если тип данных VARCHAR/NVARCHAR) указатель используются для хранения в качестве опорного указателя в основной колонне. если это текстовый/текстовый тип данных, то 16 байтов Используется poiner.

+0

Если вы не находитесь в SQL Server 2000 или ранее, вы никогда не должны использовать текст или ntext. – HLGEM

+0

Да, @HLGEM вы правы. Но если varchar/nvarchar не решает проблему, то в этом худшем случае я рекомендую использовать text/ntext. Поскольку Varchar/Nvarchar использует указатель 24 байта, но text/ntext использует 16-байтовый указатель, поэтому вы можете хранить 1,5 (24/16) раза больше данных с помощью text/ntext. Поэтому я предложил его только в этом худшем случае. Я также рекомендую избегать использования текста или текста в любых других случаях. –

+1

@ Kaushik Sharma также добавили важную информацию. http://stackoverflow.com/questions/14070932/work-around-sql-server-maximum-columns-limit-1024-and-8kb-record-size –

0

Я согласен, что Varchar или NVARCHAR (Max) является хорошим решением, и вероятно, будет работать для вы, но полнота, я предлагаю вам также создать более одной таблицы с двумя таблицами, имеющими отношения «один-к-одному».