powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
16 сообщений из 16, страница 1 из 1
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
    #40099330
Здравствуйте!

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


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

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

все там нормально формируется, вы где то у себя оперируете с типом 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
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
    #40099339
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун,
на EXEC ограничений нет.

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



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


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

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


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

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

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

это давно известная проблема.
решение:
Код: 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
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
    #40099357
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valv
это давно известная проблема.


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


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

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

какие ваши доказательства? Пример продемонстрируйте.
...
Рейтинг: 0 / 0
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
    #40099450
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Почему переменная ограничивается 4000 символами при типе NVARCHAR(MAX)?
    #40099463
4es,

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

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


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

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


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

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


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

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


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


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