Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 exec function in dynamic sql  [new]
Skulll
Member

Откуда: Чехия
Сообщений: 487
Всем привет!

Есть функция
	EXEC	@return_value = [CADIS_PROC].[SPDM_MP1_SOURCE437_REALIGN_REALIGNNULL]
			@OldCADISId = @cadisid,
			@CADISRowId = @rowid,
			@ChangedBy = N'BASE\еее66',
			@ChangedDate = @updated_date,
			@Comment = N'reset BBG Cadis Id Assignment'


Названия функции заранее неизвестно

Собираю и вызываю функци вот так
	SET @SQL = 
		'@return_value_par = ' + @PROC_NAME + '
		@OldCADISId = @cadisid_par,
		@CADISRowId = @rowid_par,
		@ChangedBy = suser_name(),
		@ChangedDate = @updated_date_par,
		@Comment = ''reset BBG Cadis Id Assignment''';

	exec sp_executesql
		@SQL
		'@return_value_par int OUTPUT, @cadisid_par int, @rowid_par int, @updated_date_par datetime',
		@cadisid_par = @cadisid,  @rowid_par=@rowid, @updated_date_par=@updated_date, @return_value_par = @return_value OUTPUT


Но, получаю ошибку
Msg 214, Level 16, State 2, Procedure sp_executesql, Line 1 [Batch Start Line 0]
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.


Раньше с Ораклом работал, знаю как там вызвать правильно фукнцию с параметрами, в том числе и возвращаемыми, но как ту?
Подскажите пожалуйста.
9 фев 17, 14:48    [20196975]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37200
Вам же красным по-белому в тексте ошибки все написали. Или ораклоидами не принято текст ошибок читать?
9 фев 17, 14:49    [20196985]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
Skulll
Member

Откуда: Чехия
Сообщений: 487
Извиняюсь, ошибка выле была связана с NVARCHAR, сейчас ошибка така
Incorrect syntax near '@return_value_par int OUTPUT, @cadisid_par int, @rowid_par int, @updated_date_par datetime'.
9 фев 17, 14:51    [20196987]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37200
Еще не понятно, зачем здесь динамика. Вместо имени процедуры в EXECUTE можно подставить переменную с именем.
9 фев 17, 14:51    [20196990]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37200
Skulll,

exec sp_executesql
		@SQL,
		'@return_value_par int OUTPUT, @cadisid_par int, @rowid_par int, @updated_date_par datetime',
		@cadisid_par = @cadisid,  @rowid_par=@rowid, @updated_date_par=@updated_date, @return_value_par = @return_value OUTPUT
9 фев 17, 14:52    [20196995]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
aleks2
Guest
	SET @SQL = 
		'EXEC @return_value_par = ' + @PROC_NAME + '
		@OldCADISId = @cadisid_par,
		@CADISRowId = @rowid_par,
		@ChangedBy = suser_name(),
		@ChangedDate = @updated_date_par,
		@Comment = ''reset BBG Cadis Id Assignment''';
9 фев 17, 14:53    [20197002]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
Skulll
Member

Откуда: Чехия
Сообщений: 487
Спасибо всем, работает!!

В итоге - добавил EXEC в текст процедуры, и добавил везде NVARCHAR
9 фев 17, 15:03    [20197050]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
Skulll
Собираю и вызываю функци вот так
	SET @SQL = 
		'@return_value_par = ' + @PROC_NAME + '
		@OldCADISId = @cadisid_par,
		@CADISRowId = @rowid_par,
		@ChangedBy = suser_name(),
		@ChangedDate = @updated_date_par,
		@Comment = ''reset BBG Cadis Id Assignment''';

	exec sp_executesql
		@SQL
		'@return_value_par int OUTPUT, @cadisid_par int, @rowid_par int, @updated_date_par datetime',
		@cadisid_par = @cadisid,  @rowid_par=@rowid, @updated_date_par=@updated_date, @return_value_par = @return_value OUTPUT
Вместо этого достаточно написать:
exec @return_value = @PROC_NAME @cadisid_par, @rowid_par, suser_name(), @updated_date_par, 'reset BBG Cadis Id Assignment';
9 фев 17, 15:04    [20197058]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
aleks2
Guest
invm
Skulll
Собираю и вызываю функци вот так
	SET @SQL = 
		'@return_value_par = ' + @PROC_NAME + '
		@OldCADISId = @cadisid_par,
		@CADISRowId = @rowid_par,
		@ChangedBy = suser_name(),
		@ChangedDate = @updated_date_par,
		@Comment = ''reset BBG Cadis Id Assignment''';

	exec sp_executesql
		@SQL
		'@return_value_par int OUTPUT, @cadisid_par int, @rowid_par int, @updated_date_par datetime',
		@cadisid_par = @cadisid,  @rowid_par=@rowid, @updated_date_par=@updated_date, @return_value_par = @return_value OUTPUT
Вместо этого достаточно написать:
exec @return_value = @PROC_NAME @cadisid_par, @rowid_par, suser_name(), @updated_date_par, 'reset BBG Cadis Id Assignment';


Да ладно те, чувак учится.
9 фев 17, 15:25    [20197172]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
Skulll
Member

Откуда: Чехия
Сообщений: 487
invm
Skulll
Собираю и вызываю функци вот так
	SET @SQL = 
		'@return_value_par = ' + @PROC_NAME + '
		@OldCADISId = @cadisid_par,
		@CADISRowId = @rowid_par,
		@ChangedBy = suser_name(),
		@ChangedDate = @updated_date_par,
		@Comment = ''reset BBG Cadis Id Assignment''';

	exec sp_executesql
		@SQL
		'@return_value_par int OUTPUT, @cadisid_par int, @rowid_par int, @updated_date_par datetime',
		@cadisid_par = @cadisid,  @rowid_par=@rowid, @updated_date_par=@updated_date, @return_value_par = @return_value OUTPUT
Вместо этого достаточно написать:
exec @return_value = @PROC_NAME @cadisid_par, @rowid_par, suser_name(), @updated_date_par, 'reset BBG Cadis Id Assignment';


Спасибо, так тоже работает! и так намного лаконичнее
9 фев 17, 16:40    [20197563]     Ответить | Цитировать Сообщить модератору
 Re: exec function in dynamic sql  [new]
iap
Member

Откуда: Москва
Сообщений: 47063
Skulll
invm
пропущено...
Вместо этого достаточно написать:
exec @return_value = @PROC_NAME @cadisid_par, @rowid_par, suser_name(), @updated_date_par, 'reset BBG Cadis Id Assignment';



Спасибо, так тоже работает! и так намного лаконичнее
Гораздо важнее, что в этом случае нет никакого динамического SQL
9 фев 17, 18:37    [20198058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить