SSMS и SQLCMD отображают только первые 8000 символов.

В SSMS, когда я пытаюсь выполнить:

SELECT CONVERT(VARCHAR(MAX), REPLICATE('a',9000))    

Я вижу только первые 8000 отображаемых символов. В настройках Инструмент >> Параметры >> Результаты запроса >> Сервер Sql >> Результаты в сетке установлено значение 65534, а для Результаты в текст установлено значение 8192.

Также, когда я пытаюсь запустить это из SQLCMD

sqlcmd -S Server -E -y 0 -Q "SELECT CONVERT(VARCHAR(MAX), REPLICATE('a',9000))" -o out.txt

Я вижу только 8000 символов.

Флаг -y 0 должен установить его до 1 МБ. Но я не более 8000 символов.

В чем может быть проблема?

спасибо,
_UB


person UB.    schedule 01.09.2009    source источник


Ответы (3)


Выходные данные REPLICATE основаны на входных данных типа. Итак, это объясняет sqlcmd.

Если строковое выражение не имеет типа varchar(max) или nvarchar(max), REPLICATE усекает возвращаемое значение до 8000 байт. Чтобы возвращать значения, превышающие 8000 байт, строковое выражение должно быть явно приведено к соответствующему типу данных с большими значениями.

Итак, используйте это SELECT REPLICATE(CONVERT(VARCHAR(MAX), 'a'), 9000)

И SSMS никогда не показывала все текстовые данные (как и Query Analyzer).

person gbn    schedule 01.09.2009
comment
ааа... РЕПЛИКАЦИЯ. Я знал это. Просто не подумал об этом перед публикацией. Виноват. Спасибо за ответ. - person UB.; 02.09.2009

Глянь сюда :

http://www.sqlservercentral.com/articles/varchar(max)/67057/

person MartW    schedule 01.09.2009

VARCHAR(MAX) может содержать только 8000 символов.

см. здесь

Из MSDN:

varchar [ ( n | max ) ] — символьные данные переменной длины, отличные от Unicode. n может принимать значения от 1 до 8000. max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт.

Как говорит Джозеф (ниже), чтобы вместить больше, используйте тип данных text или ntext, но если вы хотите иметь возможность поиска по нему, вам потребуется какая-либо форма полнотекстового индексирования.

Лучшая ссылка

person CodeMonkey1313    schedule 01.09.2009
comment
varchar(max) — это тип LOB! Ваша цитата на самом деле говорит, что max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт. - person gbn; 01.09.2009
comment
мои извинения за плохую ссылку, см. здесь doc.ddart.net/mssql/sql70/ da-db_1.htm для полного макета. Кроме того, это размер хранилища, а не максимальное количество символов. - person CodeMonkey1313; 02.09.2009
comment
Еще хуже: новая ссылка предназначена для SQL 7, в котором не было varchar(max), который заменяет текстовый тип данных - person gbn; 02.09.2009
comment
В самом деле ? Я помню, как раньше хранил в VARCHAR(MAX) более 8000 символов. Насколько я знаю, он может хранить до 2 ГБ данных. - person UB.; 02.09.2009
comment
Из BoL: max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байт. - person UB.; 02.09.2009