Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Странное усечение строк nvarchar(max)  [new]
_Guest123
Member

Откуда:
Сообщений: 9
Здравствуйте.
Нарвался недавно на непонятное урезание длины переменной типа nvarchar(max) .
Для поиска этой ошибки я сделал 7 тестов.
По возможности, можете объяснить причины таких результатов в каждом из тестов.

-- Тест 1: Строка без явного указания типа + nvarchar = итоговая строка усекается

DECLARE   @cSmallSrting	nvarchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

SET @cLargeString = 'Строка длиной 4500 символов' + @cSmallSrting;

SELECT LEN(@cLargeString);

--------------------
3999

GO

-- Тест 2: Строка с явным указанием типа + nvarchar = итоговая строка не усекается

DECLARE   @cSmallSrting	nvarchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

SET @cLargeString = N'Строка длиной 4500 символов' + @cSmallSrting;

SELECT LEN(@cLargeString);

--------------------
4510

GO


-- Тест 3: Строка без явного указания типа + varchar = итоговая строка не усекается

DECLARE   @cSmallSrting	varchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

SET @cLargeString = 'Строка длиной 4500 символов' + @cSmallSrting;

SELECT LEN(@cLargeString);

--------------------
4510

GO

-- Тест 4: Строка без явного указания типа + nvarchar + Строка без явного указания типа = итоговая строка усекается 
-- !!! Причем часть данных усечется из конца 1-й строки, а часть из начала 2-й

DECLARE   @cSmallSrting	nvarchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

SET @cLargeString = 'Строка длиной 10000 символов' + @cSmallSrting + 'Строка длиной 5000 символов';

SELECT LEN(@cLargeString);

--------------------
Примерно 13000 символов

GO

-- Тест 5: Строка с явным указанием типа + nvarchar + Строка без явного указания типа = итоговая строка усекается , как и в Тесте 4

DECLARE   @cSmallSrting	nvarchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

SET @cLargeString = N'Строка длиной 10000 символов' + @cSmallSrting + 'Строка длиной 5000 символов';

SELECT LEN(@cLargeString);

--------------------
Примерно 13000 символов

GO

-- Тест 6: Строка без явного указания типа + nvarchar + Строка с явным указанием типа = итоговая строка не усекается

DECLARE   @cSmallSrting	nvarchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

SET @cLargeString = 'Строка длиной 10000 символов' + @cSmallSrting + N'Строка длиной 5000 символов';

SELECT LEN(@cLargeString);

--------------------
15010 символов

GO

-- Тест 7: Строка без явного указания типа + varchar + Строка без явного указания типа = итоговая строка не усекается

DECLARE   @cSmallSrting	varchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) = NULL;

SET @cLargeString = 'Строка длиной 10000 символов' + @cSmallSrting + 'Строка длиной 5000 символов';

SELECT LEN(@cLargeString);

--------------------
15010 символов

GO


Но в первую очередь меня интересует результат поведения Теста 4.
Объясните, почему строка усекается, но не до 4000 символов? Почему при сложении часть символов урежется из конца первой строки, а часть из начала второй строки?

----
Version: Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) Dec 28 2012 20:23:12 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
----


Спасибо.
10 июл 14, 22:47    [16289468]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Тип аргумента слева от присваивания никак не влияет на типы агругемнтов справа от присваивания и на типы, получающиеся в результате операций
Вот вы как думаете, какой тип имеют ваши 'Строка длиной 10000 символов' и 'Строка длиной 5000 символов' ?
10 июл 14, 23:34    [16289611]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
_Guest123
Member

Откуда:
Сообщений: 9
"Тип аргумента слева от присваивания никак не влияет на типы агругемнтов справа от присваивания и на типы, получающиеся в результате операций"

Да, это понятно, но тем не менее из этого не становятся очевидны получившиеся результаты.


"Вот вы как думаете, какой тип имеют ваши 'Строка длиной 10000 символов' и 'Строка длиной 5000 символов' ?"

varchar
11 июл 14, 00:21    [16289664]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31435
_Guest123
"Вот вы как думаете, какой тип имеют ваши 'Строка длиной 10000 символов' и 'Строка длиной 5000 символов' ?"

varchar
Типа varchar не бывает.

Есть тип varchar(max) и типы varchar(конкретное число)
11 июл 14, 00:26    [16289668]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
_Guest123
Member

Откуда:
Сообщений: 9
Как я понимаю, varchar(max)
11 июл 14, 00:32    [16289678]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
_Guest123,
+ (String Concatenation) (Transact-SQL)
автор
If the result of the concatenation of strings exceeds the limit of 8,000 bytes, the result is truncated. However, if at least one of the strings concatenated is a large value type, truncation does not occur.

Glory
Вот вы как думаете, какой тип имеют ваши 'Строка длиной 10000 символов' и 'Строка длиной 5000 символов' ?
Constants (Transact-SQL)
автор
Character constants greater than 8000 bytes are typed as varchar(max) data.
Unicode constants greater than 8000 bytes are typed as nvarchar(max) data.


Таким образом, если результат конкатенации больше 8000 байт, и каждая строковая переменная или константа, участвующая в конкатенации, меньше 8000 байт, то результат будет усечен.

В примере 4 'Строка длиной 10000 символов' по факту у вас короче 8000 символов.
11 июл 14, 05:06    [16289770]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Ruuu
В примере 4 'Строка длиной 10000 символов' по факту у вас короче 8000 символов.
скорее всего равна 8000, подозреваю, что эту строку вы также получаете конкатенацией, это ответит на вопрос:

_Guest123
Почему при сложении часть символов урежется из конца первой строки, а часть из начала второй строки?
11 июл 14, 05:13    [16289771]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
_Guest123
Member

Откуда:
Сообщений: 9
Ruuu
Таким образом, если результат конкатенации больше 8000 байт, и каждая строковая переменная или константа, участвующая в конкатенации, меньше 8000 байт, то результат будет усечен.

В примере 4 'Строка длиной 10000 символов' по факту у вас короче 8000 символов.


Ruuu
скорее всего равна 8000, подозреваю, что эту строку вы также получаете конкатенацией


Нет, не совсем так.

Если разбирать Тест 4, точно как у меня, то выглядит это у меня так:

-- Тест 4: 

DECLARE   @cSmallSrting	nvarchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

SET @cLargeString = 'Строка символов 1' + @cSmallSrting + 'Строка символов 2';

SELECT LEN(@cLargeString), LEN('Строка символов 1'), LEN('Строка символов 2');

                                 
-------------------- ----------- -----------
13485                   9476          4738



'Строка символов 1' и 'Строка символов 2', это цельные строки текста, в них никаких внутренних конкатенаций нет.
11 июл 14, 13:09    [16291545]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
_Guest123
DECLARE   @cSmallSrting	nvarchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

SET @cLargeString = 'Строка символов 1' + @cSmallSrting + 'Строка символов 2';

SELECT LEN(@cLargeString), LEN('Строка символов 1'), LEN('Строка символов 2');

                                 
-------------------- ----------- -----------
13485                   9476          4738
Чо за фигня!
У меня получается:
-------------------- ----------- -----------
44 17 17
11 июл 14, 13:14    [16291595]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap,

+1
2008R2
11 июл 14, 13:20    [16291650]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
_Guest123,

> 13485 9476 4738

у меня 13486 получается.
усекается только последняя строка, та, что длиной 4738 символов. дело в том, что сначала она преобразовывается из varchar(n) в nvarchar(n) и при этом усекается до максимально возможных для этого типа 4000 символов. прямого подтверждения в документации я именно такому поведению не нахожу, но логика в этом есть.
11 июл 14, 13:22    [16291669]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
_Guest123
Member

Откуда:
Сообщений: 9
Не, ну не воспринимайте строки 'Строка символов 1' и 'Строка символов 2', буквально)) Я же не буду сюда выкладывать реальные строки в 5 и 10 тысяч символов.
11 июл 14, 13:23    [16291679]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
_Guest123
Не, ну не воспринимайте строки 'Строка символов 1' и 'Строка символов 2', буквально)) Я же не буду сюда выкладывать реальные строки в 5 и 10 тысяч символов.
Можно было заполнить их REPLICATEом
11 июл 14, 13:25    [16291691]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
iap
_Guest123
Не, ну не воспринимайте строки 'Строка символов 1' и 'Строка символов 2', буквально)) Я же не буду сюда выкладывать реальные строки в 5 и 10 тысяч символов.
Можно было заполнить их REPLICATEом
и спрятать под спойлер
11 июл 14, 13:28    [16291715]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
iap
Чо за фигня!
У меня получается:
-------------------- ----------- -----------
44 17 17


ну, я могу и выложить. :) replicate-ом немножко не то будет - явно придется тип результата replicate контролировать.

+

DECLARE @cSmallSrting nvarchar(10) = '0123456789'
, @cLargeString nvarchar(MAX) = NULL;

set @cLargeString = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + @cSmallSrting + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
select len(@cLargeString)
11 июл 14, 13:32    [16291749]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
_Guest123
Member

Откуда:
Сообщений: 9
daw
у меня 13486 получается.
усекается только последняя строка, та, что длиной 4738 символов. дело в том, что сначала она преобразовывается из varchar(n) в nvarchar(n) и при этом усекается до максимально возможных для этого типа 4000 символов. прямого подтверждения в документации я именно такому поведению не нахожу, но логика в этом есть.



Смотрите, вот ту (https://www.sql.ru/forum/901721/nvarchar-max-i-8000-simvolov), пишут:

автор
Мои предположения, скорее всего при неявном преобразовании varchar(max) и nvarchar(max) выбираются такими (минимально выделенная память), чтобы данные вместились на одну страницу. А вот если не будет хватать длинны, то скуль расширяет (выделяет) еще одну станицу для хранения...


Думаю, дело в этом, но я не уверен. Хотел бы получить какое-нибудь подтверждение того, что это именно так работает.

А на счет того, что "усекается только последняя строка", у меня урезались обе строки. Я попробую сымитировать эту ситуацию и покажу , что усекуться обе строки.
11 июл 14, 13:33    [16291753]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
_Guest123
Member

Откуда:
Сообщений: 9
iap
Можно было заполнить их REPLICATEом


С REPLICATE или SPACE у вас такой ситуации не получится.

DECLARE @s varchar(MAX);
SET @s = replicate('a', 10000);

SELECT LEN(@s);

--------------------
8000


Тут у меня как раз именно цельные строки длиной 10000 символов.
11 июл 14, 13:40    [16291794]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Думаю, дело в этом, но я не уверен. Хотел бы получить какое-нибудь подтверждение того, что это именно так работает.

как это работает уже расписали, вроде. с цитатами из документации (ну, кроме моего уточнения).

> А на счет того, что "усекается только последняя строка", у меня урезались обе строки.
> Я попробую сымитировать эту ситуацию и покажу , что усекуться обе строки.

ждем-с.
11 июл 14, 13:40    [16291802]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
Shakill
Member

Откуда: мск
Сообщений: 1880
_Guest123,

SET @s = replicate(cast('a' as nvarchar(max)), 10000);
11 июл 14, 13:42    [16291819]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
daw
усекается только последняя строка, та, что длиной 4738 символов. дело в том, что сначала она преобразовывается из varchar(n) в nvarchar(n) и при этом усекается до максимально возможных для этого типа 4000 символов. прямого подтверждения в документации я именно такому поведению не нахожу, но логика в этом есть.
да, это из-за неявного преобразования из varchar в nvarchar, если преобразовать явно, то строка не усечется.

Этот вопрос подробно разобран на stackoverflow: SQL NVARCHAR and VARCHAR Limits

Вот еще тикет на Microsoft Connect по теме: nvarchar(max) truncated during concatenation

Ту ТС, когда складываете строки, не мешайте varchar с nvarchar'ом и проблем будет меньше.
11 июл 14, 13:42    [16291820]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
случайно заглянул
Guest
DECLARE
  @cSmallSrting	nvarchar(10) = N'0123456789'
 ,@a nvarchar(max) 
 ,@b nvarchar(max)
 ,@cLargeString	nvarchar(MAX)
 ,@i nvarchar(max)
 
set @i = N'a'
set @a = replicate(@i, 10000)
set @i = N'b'
set @b = replicate(@i, 5000)

SET @cLargeString = @a + @cSmallSrting + @b

SELECT LEN(@cLargeString), LEN(@a), LEN(@b)


что я делаю не так?
11 июл 14, 13:51    [16291878]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
случайно заглянул
Guest
результат забыл выложить:
-------------------- ----------- -----------
15010 10000 8000
11 июл 14, 13:52    [16291886]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
случайно заглянул
результат забыл выложить:
-------------------- ----------- -----------
15010 10000 8000


вот странно, а как вам удалось из replicate(@i, 5000) получить 8000 символов? :)
а что не так - ну, вы, в отличие от тс, оперируете переменными с явно указанным типом nvarchar(max). "ну, так и я могу" (с)
11 июл 14, 14:00    [16291932]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
случайно заглянул
результат забыл выложить:
-------------------- ----------- -----------
15010 10000 8000
это у вас надо спросить как в третьем случае получилось 8000 вместо 5000.
11 июл 14, 14:01    [16291940]     Ответить | Цитировать Сообщить модератору
 Re: Странное усечение строк nvarchar(max)  [new]
случайно заглянул
Guest
daw
случайно заглянул
результат забыл выложить:
-------------------- ----------- -----------
15010 10000 8000


вот странно, а как вам удалось из replicate(@i, 5000) получить 8000 символов? :)
а что не так - ну, вы, в отличие от тс, оперируете переменными с явно указанным типом nvarchar(max). "ну, так и я могу" (с)



я просто описАлся, конечно же 5000, а не 8000

а то, что я явно написал nvarchar(max), так в етом и была суть моего вопроса с сарказмом ;)
надеюсь, что этот прямой пример приведет ТС к пониманию, а то предложенную ему документацию он еще долго изучать будет :)
11 июл 14, 14:05    [16291961]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить