Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)? / 16 сообщений из 16, страница 1 из 1
22.09.2021, 15:32
    #40099330
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
Здравствуйте!

Внутри хранимой процедуры формирую в переменной @query(типа NVARCHAR(MAX)) строку будущего запроса, который потом будет исполняться командой вида:
Код: sql
1.
EXEC (@query)


Получаю ошибку исполнения, поскольку не весь запрос помещается в переменную, о чем свидетельствует функция LEN(@query), возвращающая значение 4000.

Как же сформировать текст динамического запроса полностью, дорогие форумчане?
...
Рейтинг: 0 / 0
22.09.2021, 15:33
    #40099331
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
Борис Гаркун,

все там нормально формируется, вы где то у себя оперируете с типом nvarchar(4000)

Код: sql
1.
2.
3.
4.
5.
declare @n nvarchar(max) = cast('B' as nvarchar(4000)) + replicate('A', 5000),
        @v nvarchar(max) = replicate('A', 5000),
        @w nvarchar(max) = replicate(N'A',5000)

select len(@n), len(@v), len(@w)
...
Рейтинг: 0 / 0
22.09.2021, 15:54
    #40099339
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
Борис Гаркун,
на EXEC ограничений нет.

Код: sql
1.
2.
3.
4.
DECLARE @Query NVARCHAR(MAX) = 'SELECT ''0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789''';
SET @Query = REPLICATE(@Query , 100);
SELECT LEN(@Query );
EXEC(@Query) 



Может вы там запрос на терабайт сгенерить решили?
...
Рейтинг: 0 / 0
22.09.2021, 16:09
    #40099348
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
a_voronin
Борис Гаркун,
на EXEC ограничений нет.

Код: sql
1.
2.
3.
4.
DECLARE @Query NVARCHAR(MAX) = N'SELECT ''0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789''';
SET @Query = REPLICATE(@Query , 100);
SELECT LEN(@Query );
EXEC(@Query) 




Может вы там запрос на терабайт сгенерить решили?
...
Рейтинг: 0 / 0
22.09.2021, 16:12
    #40099350
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
a_voronin
Борис Гаркун,
на EXEC ограничений нет.


Неправда ваша.
Ограничения есть... в MS SQL 2000.

Тредстартер не огласил версию.
...
Рейтинг: 0 / 0
22.09.2021, 16:13
    #40099351
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
aleks222
a_voronin
Борис Гаркун,
на EXEC ограничений нет.


Неправда ваша.
Ограничения есть... в MS SQL 2000.

Тредстартер не огласил версию.

У ТС NVARCHAR(MAX), т.е. минимум 2005
...
Рейтинг: 0 / 0
22.09.2021, 16:25
    #40099355
valv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
Борис Гаркун,

это давно известная проблема.
решение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or alter procedure dba.ExecLongQuery(
	@SqlQuery varchar(max)
)
as
begin
	declare @SQL1 varchar(8000), @SQL2 varchar(8000), @SQL3 varchar(8000)
	select @SQL1 = substring (@SqlQuery, 0, 8000)
		, @SQL2 = substring (@SqlQuery, 8000, 8000) 
		, @SQL3 = substring (@SqlQuery, 16000, 8000) 
	exec (@SQL1+@SQL2+@SQL3)
end
go
...
Рейтинг: 0 / 0
22.09.2021, 16:30
    #40099357
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
valv
это давно известная проблема.


Никакой проблемы нет, и exec(...) отлично работает со строками больше 4000 (8000) символов.
Пример выше.
...
Рейтинг: 0 / 0
22.09.2021, 16:35
    #40099358
valv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
msLex
valv
это давно известная проблема.


Никакой проблемы нет, и exec(...) отлично работает со строками больше 4000 (8000) символов.
Пример выше.

забавно-с.
решение есть, а проблемы нет.
...
Рейтинг: 0 / 0
22.09.2021, 19:01
    #40099393
4es
4es
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
Когда собираете @query, в явном виде конвертируйте хотя бы первую часть в nvarchar(max).
Как вот тут, например
https://bertwagner.com/posts/why-is-my-varcharmax-variable-getting-truncated/
...
Рейтинг: 0 / 0
22.09.2021, 22:29
    #40099424
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
Борис Гаркун,

какие ваши доказательства? Пример продемонстрируйте.
...
Рейтинг: 0 / 0
23.09.2021, 07:07
    #40099450
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
valv
msLex
пропущено...


Никакой проблемы нет, и exec(...) отлично работает со строками больше 4000 (8000) символов.
Пример выше.

забавно-с.
решение есть, а проблемы нет.

Пример выше - это не решение, а демонстрация, как работать правильно с конкатенацией в случае large data type.
Это всё давным-давно известно, побочный эффект от конкатенации строковых литералов - скорее всего, в скрипте каждый из них меньше 4000 символов, и результат конкатенации обрезается. Как уже выше писали, в таком случае нужно хотя бы 1 конкатенируемый операнд привести к длинному типу:
Код: 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.
declare
  @s1 nvarchar(4000),
  @s2 nvarchar(max);
set @s1='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
select len(@s1);
set @s2=
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 1000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 2000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 3000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 4000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 5000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 6000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 7000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 8000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1  -- 9000
  ;
select len(@s2);
set @s2=cast('' as nvarchar(max))+
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 1000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 2000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 3000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 4000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 5000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 6000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 7000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+ -- 8000
  @s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1+@s1  -- 9000
  ;
select len(@s2);


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
-----------
100

(1 row affected)

--------------------
4000

(1 row affected)

--------------------
9000

(1 row affected)

Ну, и в документации про такую ситуацию написано вполне однозначно :
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.
...
Рейтинг: 0 / 0
23.09.2021, 09:23
    #40099463
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
4es,

именно так и сделал. Всем спасибо!
...
Рейтинг: 0 / 0
23.09.2021, 09:26
    #40099464
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
Борис Гаркун
4es,

именно так и сделал. Всем спасибо!


Как "так" ? Подробнее напишите, чтобы будущие поколения поняли, когда будут читать форум в 2030 году, например
...
Рейтинг: 0 / 0
23.09.2021, 12:55
    #40099499
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
Ролг Хупин
Борис Гаркун
4es,

именно так и сделал. Всем спасибо!


Как "так" ? Подробнее напишите, чтобы будущие поколения поняли, когда будут читать форум в 2030 году, например
При конкатенации одно из слагаемых преобразовать явно в NVARCHAR(MAX):
Код: sql
1.
CAST(@Str AS NVARCHAR(MAX))

Тогда результат сложения получится типа NVARCHAR(MAX) без усечения,
ибо перед сложением все слагаемые будут приведены к этому типу.
Правильнее, наверно, делать каждое слагаемые типа NVARCHAR(MAX) сразу при объявлении.
...
Рейтинг: 0 / 0
23.09.2021, 13:08
    #40099505
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
valv
msLex
пропущено...


Никакой проблемы нет, и exec(...) отлично работает со строками больше 4000 (8000) символов.
Пример выше.

забавно-с.
решение есть, а проблемы нет.


Наличие решения совсем не говорит о наличие проблемы.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)? / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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