powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Странное усечение строк nvarchar(max)
25 сообщений из 25, страница 1 из 1
Странное усечение строк nvarchar(max)
    #38693855
_Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Нарвался недавно на непонятное урезание длины переменной типа nvarchar(max) .
Для поиска этой ошибки я сделал 7 тестов.
По возможности, можете объяснить причины таких результатов в каждом из тестов.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
-- Тест 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)
----


Спасибо.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38693878
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тип аргумента слева от присваивания никак не влияет на типы агругемнтов справа от присваивания и на типы, получающиеся в результате операций
Вот вы как думаете, какой тип имеют ваши 'Строка длиной 10000 символов' и 'Строка длиной 5000 символов' ?
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38693897
_Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Тип аргумента слева от присваивания никак не влияет на типы агругемнтов справа от присваивания и на типы, получающиеся в результате операций"

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


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

varchar
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38693900
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Guest123"Вот вы как думаете, какой тип имеют ваши 'Строка длиной 10000 символов' и 'Строка длиной 5000 символов' ?"

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

Есть тип varchar(max) и типы varchar(конкретное число)
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38693903
_Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как я понимаю, varchar(max)
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38693931
Фотография Ruuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_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 символов.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38693932
Фотография Ruuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuuuВ примере 4 'Строка длиной 10000 символов' по факту у вас короче 8000 символов.скорее всего равна 8000, подозреваю, что эту строку вы также получаете конкатенацией, это ответит на вопрос:

_Guest123Почему при сложении часть символов урежется из конца первой строки, а часть из начала второй строки?
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694255
_Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RuuuТаким образом, если результат конкатенации больше 8000 байт, и каждая строковая переменная или константа, участвующая в конкатенации, меньше 8000 байт, то результат будет усечен.

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


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


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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
-- Тест 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', это цельные строки текста, в них никаких внутренних конкатенаций нет.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694265
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Guest123
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DECLARE   @cSmallSrting	nvarchar(10)   = '0123456789'
		, @cLargeString	nvarchar(MAX) 	= NULL;

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

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

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

Чо за фигня!
У меня получается:
Код: plaintext
1.
-------------------- ----------- -----------
44                   17          17
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694272
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

+1
2008R2
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694276
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Guest123,

> 13485 9476 4738

у меня 13486 получается.
усекается только последняя строка, та, что длиной 4738 символов. дело в том, что сначала она преобразовывается из varchar(n) в nvarchar(n) и при этом усекается до максимально возможных для этого типа 4000 символов. прямого подтверждения в документации я именно такому поведению не нахожу, но логика в этом есть.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694278
_Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, ну не воспринимайте строки 'Строка символов 1' и 'Строка символов 2', буквально)) Я же не буду сюда выкладывать реальные строки в 5 и 10 тысяч символов.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694281
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Guest123Не, ну не воспринимайте строки 'Строка символов 1' и 'Строка символов 2', буквально)) Я же не буду сюда выкладывать реальные строки в 5 и 10 тысяч символов.Можно было заполнить их REPLICATEом
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694288
Фотография Ruuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap_Guest123Не, ну не воспринимайте строки 'Строка символов 1' и 'Строка символов 2', буквально)) Я же не буду сюда выкладывать реальные строки в 5 и 10 тысяч символов.Можно было заполнить их REPLICATEоми спрятать под спойлер
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694296
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapЧо за фигня!
У меня получается:
Код: plaintext
1.
-------------------- ----------- -----------
44                   17          17


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


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

set @cLargeString = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' + @cSmallSrting + 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
select len(@cLargeString)
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694298
_Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dawу меня 13486 получается.
усекается только последняя строка, та, что длиной 4738 символов. дело в том, что сначала она преобразовывается из varchar(n) в nvarchar(n) и при этом усекается до максимально возможных для этого типа 4000 символов. прямого подтверждения в документации я именно такому поведению не нахожу, но логика в этом есть.



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

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


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

А на счет того, что "усекается только последняя строка", у меня урезались обе строки. Я попробую сымитировать эту ситуацию и покажу , что усекуться обе строки.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694306
_Guest123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapМожно было заполнить их REPLICATEом


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

Код: sql
1.
2.
3.
4.
5.
6.
7.
DECLARE @s varchar(MAX);
SET @s = replicate('a', 10000);

SELECT LEN(@s);

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



Тут у меня как раз именно цельные строки длиной 10000 символов.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694308
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Думаю, дело в этом, но я не уверен. Хотел бы получить какое-нибудь подтверждение того, что это именно так работает.

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

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

ждем-с.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694312
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Guest123,

Код: sql
1.
SET @s = replicate(cast('a' as nvarchar(max)), 10000);
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694313
Фотография Ruuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dawусекается только последняя строка, та, что длиной 4738 символов. дело в том, что сначала она преобразовывается из varchar(n) в nvarchar(n) и при этом усекается до максимально возможных для этого типа 4000 символов. прямого подтверждения в документации я именно такому поведению не нахожу, но логика в этом есть.да, это из-за неявного преобразования из varchar в nvarchar, если преобразовать явно, то строка не усечется.

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

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

Ту ТС, когда складываете строки, не мешайте varchar с nvarchar'ом и проблем будет меньше.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694326
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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)



что я делаю не так?
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694328
результат забыл выложить:
-------------------- ----------- -----------
15010 10000 8000
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694338
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайно заглянулрезультат забыл выложить:
-------------------- ----------- -----------
15010 10000 8000

вот странно, а как вам удалось из replicate(@i, 5000) получить 8000 символов? :)
а что не так - ну, вы, в отличие от тс, оперируете переменными с явно указанным типом nvarchar(max). "ну, так и я могу" (с)
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694339
Фотография Ruuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
случайно заглянулрезультат забыл выложить:
-------------------- ----------- -----------
15010 10000 8000это у вас надо спросить как в третьем случае получилось 8000 вместо 5000.
...
Рейтинг: 0 / 0
Странное усечение строк nvarchar(max)
    #38694349
dawслучайно заглянулрезультат забыл выложить:
-------------------- ----------- -----------
15010 10000 8000

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


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

а то, что я явно написал nvarchar(max), так в етом и была суть моего вопроса с сарказмом ;)
надеюсь, что этот прямой пример приведет ТС к пониманию, а то предложенную ему документацию он еще долго изучать будет :)
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Странное усечение строк nvarchar(max)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]