Динамический вызов хранимой процедуры из другой хранимой процедуры - PullRequest
6 голосов
/ 31 мая 2010

Я хочу иметь возможность передавать имя хранимой процедуры в виде строки в другую хранимую процедуру и вызывать ее с динамическими параметрами. Я получаю сообщение об ошибке.

В частности, я пробовал:

create procedure test @var1 varchar(255), @var2 varchar(255) as
    select 1

create procedure call_it @proc_name varchar(255)
    as
    declare @sp_str varchar(255)
    set @sp_str = @proc_name + ' ''a'',''b'''
    print @sp_str
    exec @sp_str

exec call_it 'test'

Таким образом, процедура call_it должна вызывать процедуру test с аргументами 'a' и 'b'.

Когда я запускаю приведенный выше код, я получаю:

Сообщение 2812, Уровень 16, Состояние 62, Процедура call_it, Строка 6 Не удалось найти хранимую процедуру 'test' a ',' b ''.

Однако выполнение теста «a», «b» работает нормально.

Ответы [ 3 ]

8 голосов
/ 31 мая 2010

вам нужны скобки

exec (@sp_str)

, если proc не существует, сообщение будет следующим:

Сообщение 2812, Уровень 16, Состояние 62, Строка 1 Не удалось найти хранимую процедуру 'test'.

это не будет Не удалось найти хранимую процедуру 'test' a ',' b ''

Хотя все еще плохая идея с внедрением SQL, попробуйте использовать sp_executeSQL и использовать параметры, см. Здесь о повторном использовании плана запроса: Изменение exec на sp_executesql не дает никакой выгоды, если вы не используете параметры правильно

3 голосов
/ 31 мая 2010

Вы должны использовать процедуру "sp_executesql". Посмотрите на MSDN - sp_executesql .

0 голосов
/ 09 июня 2018

Вам вообще не нужен какой-либо динамический SQL (EXEC() или sp_executesql) для достижения этого результата:

create procedure test @var1 varchar(255), @var2 varchar(255) 
as
BEGIN
    select @var1, @var2;
END;

create procedure call_it @proc_name varchar(255)
as
BEGIN
declare @param1 VARCHAR(255) = 'a'
       ,@param2 VARCHAR(255) = 'b';
exec @proc_name @param1, @param2;  --it isn't dynamic-SQL(simple procedure call)
END;

exec call_it @proc_name = 'test';

DBFiddle Demo


От ВЫПОЛНИТЬ :

[ { EXEC | EXECUTE } ]  
{   
  [ @return_status = ]  
  { module_name [ ;number ] | @module_name_var }   

@ module_name_var

Isимя локальной переменной, которая представляет имя модуля.

Это может быть переменная, которая содержит имя скалярно скомпилированной пользовательской функции с исходным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...