Ваша односимвольная литеральная строка по-прежнему nvarchar
и не , объявленная как MAX
. Согласно документации :
Если string_expression не относится к типу varchar (max) или nvarchar (max), REPLICATE усекает возвращаемое значение до 8000 байт. Чтобы возвращать значения, превышающие 8000 байт, выражение string_expression должно быть явно приведено к соответствующему типу данных большого значения.
Поэтому у вас есть nvarchar(1)
, который повторяется 9000 раз. Когда у вас есть 4000 символов, у вас есть 8000 байтов, и, таким образом, предел достигнут. Если вам нужно 8000 символов, вам нужно сделать это:
DECLARE @SQL varchar(8000);
SET @SQL = REPLICATE(CONVERT(nvarchar(MAX), N'A'), 9000);
SELECT LEN(@SQL); --Returns 8,000
Редактировать: Выше также возвращает усеченное значение, без ошибок, так как это также задокументировано :
При преобразовании символьных или двоичных выражений (двоичное, char, nchar, nvarchar, varbinary или varchar) в выражение другого типа данных, операция преобразования может обрезать выходные данные, только частично отобразить выходные данные или верните ошибку. Эти случаи произойдут, если результат будет слишком коротким для отображения. Преобразования в двоичные, char, nchar, nvarchar, varbinary или varchar усекаются , за исключением преобразований, показанных в следующей таблице.