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

Откуда: Киев
Сообщений: 77
есть переменная @sql varchar(max)= 'update T1 set col1 = NullIf(value1,null), col2=nullIf(value2,null) where id = MyId'

Длинна переменной @sql = 12000 символов.

Проблема: при выполнении exec(@sql) переменная обрезается до 8000 символов и команда не срабатывает.

В MSDN пишут, что Exec работает на переменной (max), то есть должно 2Гб принимать. Но этого не происходит.

Как можно решить эту проблему?


---------
Победи себя - будешь непобедим.
(А.В. Суворов)
17 апр 15, 13:22    [17528993]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
Glory
Member

Откуда:
Сообщений: 104760
ilyaBS
Проблема: при выполнении exec(@sql) переменная обрезается до 8000 символов и команда не срабатывает.

Это происходит не при выполнении, а раньше
17 апр 15, 13:24    [17529015]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
iap
Member

Откуда: Москва
Сообщений: 47050
1. EXEC()? вообще-то, работает с NVARCHAR(MAX)
2. Как выяснилось, что обрезается именно до 8000?
17 апр 15, 13:26    [17529027]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
Gviber
Member

Откуда:
Сообщений: 124
EXEC sp_executeSQL @SQL
17 апр 15, 13:28    [17529053]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
ilyaBS
Member

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

1. Пробовал и на nvarchar(max) - то же самое
2. Вызов происходит внутри процедуры. Перед командой выполнения стоит SELECT и он возвращает полную строку
select @sql
EXEC(@SQL); 
17 апр 15, 13:29    [17529068]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
o-o
Guest
ilyaBS,

вы наверное не преобразуете саму строку к varchar(max).
сравните:
declare @sql varchar(max)= replicate('a',6000) + replicate('b',6000) + replicate('c',6000);
select RIGHT(@sql, 1);
---
b

declare @sql_max varchar(max)= cast(replicate('a',6000) as varchar(max)) + replicate('b',6000) + replicate('c',6000);
select RIGHT(@sql_max, 1);
---
c

в первом варианте строка обрезается, во втором нет
17 апр 15, 13:29    [17529069]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
o-o
Guest
ilyaBS
iap,

1. Пробовал и на nvarchar(max) - то же самое
2. Вызов происходит внутри процедуры. Перед командой выполнения стоит SELECT и он возвращает полную строку
select @sql
EXEC(@SQL); 

покажите, что выдаст перед выполнением exec:
select LEN(@sql);

в моем примере выдаст 8000 в первом случае и 18000 во втором
17 апр 15, 13:33    [17529097]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
o-o,

так, нашел проблему. Дело не в динамике и процедуре. дело в том, что UPDATE команда получилась слишком длинной. пока не нашел обоснования на MSDN, но команда UPDATE длинной в 16022 символа не выполняется, даже если ее выполнять напрямую (без exec(@sql))


UPDATE состоит из 20 колонок. одной из них присваивается длинное значение в 15500 символов

Команда обрезается.
17 апр 15, 14:44    [17529610]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
Glory
Member

Откуда:
Сообщений: 104760
ilyaBS
пока не нашел обоснования на MSDN,

И вы опубликуете здесь эти обоснования ?
17 апр 15, 14:46    [17529618]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
ilyaBS
Member

Откуда: Киев
Сообщений: 77
Glory,

если найду. вы с подобным не сталкивались?
17 апр 15, 14:47    [17529636]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
Glory
Member

Откуда:
Сообщений: 104760
ilyaBS
если найду.

Т.е. вы ссылаетесь на то, в чем не уверены ?

ilyaBS
вы с подобным не сталкивались?

Постоянно. Называется проблема - мой генератор динамического кода лажает.
17 апр 15, 14:49    [17529643]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
iap
Member

Откуда: Москва
Сообщений: 47050
ilyaBS,

что вернёт
PRINT @@VERSION
??
17 апр 15, 14:50    [17529651]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
ilyaBS
Member

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

Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
May 14 2014 18:34:29
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
17 апр 15, 14:52    [17529665]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
Gviber
Member

Откуда:
Сообщений: 124
Ок. А почему у меня получается?

Error:
create table #testtable (Val nvarchar(max))
GO
insert #testtable values('')
GO
declare @test nvarchar(max) ='', @i int=0
while @i<10000
begin
	set @test+='1234567890'
	set @i+=1
end
set @test= N'update #testtable set Val='''+@test+N''''
EXEC  @test
GO
select * from #testtable
GO
drop table #testtable


It works:
create table #testtable (Val nvarchar(max))
GO
insert #testtable values('')
GO
declare @test nvarchar(max) ='', @i int=0
while @i<10000
begin
	set @test+='1234567890'
	set @i+=1
end
set @test= N'update #testtable set Val='''+@test+N''''
EXEC  sp_executeSQL @test
GO
select * from #testtable
GO
drop table #testtable
17 апр 15, 15:31    [17529944]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
Konst_One
Member

Откуда:
Сообщений: 11567
EXEC  @test
17 апр 15, 15:34    [17529975]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
ilyaBS
Команда обрезается.
Просто отладьте свой код. Вставьте где только можно select LEN(@sql)

Сервер ничего сам не обрезает, и EXEC выполняет длинные команды, и на UPDATE не накладывается ограничений по размеру.
17 апр 15, 15:34    [17529976]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31783
Gviber
EXEC  @test
Это не выполнение строки. Выполнение строки - это
EXEC (@test)
17 апр 15, 15:36    [17529986]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8325
Хех, еще один сочинитель универсальной программы всего...
17 апр 15, 15:45    [17530041]     Ответить | Цитировать Сообщить модератору
 Re: Динамический запрос VARCHAR(MAX)  [new]
o-o
Guest
нет никакого апдэйтного бага,
вот PRINT не все выводит(или студия обрезает, но мне без разницы, я на результат смотрю,
и если бы обрезалось, откуда бы верный последний символ и верная длина строки?),
но все прекрасно апдэйтится:
create table dbo.t_max(id int, col varchar(max));
insert into dbo.t_max(id, col) values (1, 'a');
go

declare @sql_max varchar(max)= 'update dbo.t_max set col = ''' +
        cast(replicate('a',6000) as varchar(max)) + replicate('b',6000) + replicate('c',6000) +
        ''' where id = 1';
print  @sql_max;

exec(@sql_max);  

select len(col) as len_, RIGHT(col,1) as last_c
from  dbo.t_max; 
---
len_	last_c
18000	c


Microsoft SQL Server 2012 - 11.0.5569.0 (Intel X86) Jan 9 2015 11:41:41 Copyright (c) Microsoft Corporation Developer Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
17 апр 15, 15:51    [17530100]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить