2009-11-10 3 views
1

Мне нужно написать тест, требующий хранения больших объемов данных в текстовом столбце.Как вставить более 8k в текстовый столбец SQL Server с помощью REPLICATE()?

Когда я пытаюсь это (вставить 2 миллиарда X символов):

INSERT INTO table VALUES (REPLICATE('X', 2000000000)) 

Это то, что я получаю:

SELECT *, DATALENGTH(textCol) FROM table 

XXXXXXXXXXXXX .... 8000

Я надеялся на более чем 8000. Любые идеи, в которых я ошибаюсь? Мой google-fu терпит неудачу.

Caveat: Да, текстовые столбцы устарели. Я уверен, что есть много очень правильных и разумных причин, почему плохой идеей хочется использовать их в качестве хранилищ массовых данных. Предположим, что я имею дело с унаследованной системой, в которой есть текстовые столбцы, хранящие большие объемы объемных данных, и я должен написать тесты, чтобы выяснить, как мой бит стороннего кода может справиться с этим.

ответ

9

REPLICATE функция returns data in the same type as was passed in. Поскольку вы передаете нормальную строку с кавычками, которая создает varchar (не путать с varchar(MAX)), которая имеет максимальную емкость 8000 символов.

Попробуйте это:

INSERT INTO table VALUES (REPLICATE(convert(varchar(MAX), 'X'), 2000000000)) 

Я не могу отпустить вас без обязательной рекомендации, которые вы используете varchar(MAX) (или nvarchar(MAX)) столбцы вместо text, но это необходимо сделать трюк. Я не сейчас перед SSMS, но вы могут иметь convert(text, REPLICATE(convert(varchar(MAX), 'X'), 2000000000)), но я так не думаю. В любом случае, это должно сделать трюк.

+0

Мотивация для его рекомендации (http://msdn.microsoft.com/en-us/library/ms187993 .aspx): ** ** ntext **, ** текст ** и ** образ ** типы данных будут удалены в будущей версии Microsoft SQL Server. Избегайте использования этих типов данных в новых разработках и планируйте измените приложения, которые в настоящее время их используют. Вместо этого используйте nvarchar (max), varchar (max) и varbinary (max). " – MaD70

4

Просто бросить встроенный в CLOB тип данных (репликации возвращает те же, как прошло), как это:

INSERT INTO table VALUES (REPLICATE(cast('X' as varchar(max)), 2000000000)) 
+0

И как раз в ответ, после того, как я опубликовал ответ Адама Робинсона, у него появилась какая-то дополнительная мысль, скорее всего, это будет лучшим ответом, поскольку я ленился и не связывался, как он. Включите встроенный подход с его ответом, и у вас есть несколько вариантов. – chadhoc

+0

+1 для того же, что и я. Я думал о конвертации после того, как я уже отправил свой ответ, я не просто браконьерство;) –

+0

+1. Спасибо за ответ. –

Смежные вопросы