Для встроенных функций, которые принимают nvarchar в качестве параметра, если задано значение varchar, оно все равно преобразуется в nvarchar (4000) - PullRequest
0 голосов
/ 10 июня 2019

Документация MS о различиях между уровнем совместимости 80 и lLevel 90 говорит об уровне совместимости 90:

"Для встроенных функций, которые принимают nvarchar в качестве параметра,если задано значение varchar, оно все равно преобразуется в nvarchar (4000). Однако, если передается большее значение, SQL Server 2008 выдает ошибку. "

Но, когда я пытаюсь это сделатьв SQL Server 2008 R2 оно всегда усекается молча:

DECLARE @SQL VARCHAR(8000)

SET @SQL = REPLICATE(N'A', 9000) -- It's return 4000

SELECT LEN(@SQL)

1 Ответ

0 голосов
/ 10 июня 2019

Ваша односимвольная литеральная строка по-прежнему 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 усекаются , за исключением преобразований, показанных в следующей таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...