Динамический запрос VARCHAR(MAX)

ilyaBS
Дата: 17.04.2015 13:22:19
есть переменная @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Гб принимать. Но этого не происходит.

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


---------
Победи себя - будешь непобедим.
(А.В. Суворов)
Glory
Дата: 17.04.2015 13:24:52
ilyaBS
Проблема: при выполнении exec(@sql) переменная обрезается до 8000 символов и команда не срабатывает.

Это происходит не при выполнении, а раньше
iap
Дата: 17.04.2015 13:26:14
1. EXEC()? вообще-то, работает с NVARCHAR(MAX)
2. Как выяснилось, что обрезается именно до 8000?
Gviber
Дата: 17.04.2015 13:28:36
EXEC sp_executeSQL @SQL
ilyaBS
Дата: 17.04.2015 13:29:44
iap,

1. Пробовал и на nvarchar(max) - то же самое
2. Вызов происходит внутри процедуры. Перед командой выполнения стоит SELECT и он возвращает полную строку
select @sql
EXEC(@SQL); 
o-o
Дата: 17.04.2015 13:29:47
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

в первом варианте строка обрезается, во втором нет
o-o
Дата: 17.04.2015 13:33:10
ilyaBS
iap,

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

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

в моем примере выдаст 8000 в первом случае и 18000 во втором
ilyaBS
Дата: 17.04.2015 14:44:58
o-o,

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


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

Команда обрезается.
Glory
Дата: 17.04.2015 14:46:02
ilyaBS
пока не нашел обоснования на MSDN,

И вы опубликуете здесь эти обоснования ?
ilyaBS
Дата: 17.04.2015 14:47:43
Glory,

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