从另一个存储过程动态调用存储过程

6

我希望能够将存储过程的名称作为字符串传递给另一个存储过程,并使用动态参数调用它。但是我遇到了错误。

具体来说,我尝试了以下方法:

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应该使用参数'a'和'b'调用测试过程。

当我运行上面的代码时,我得到了:

消息2812,级别16,状态62,过程call_it,第6行 找不到存储过程'test 'a','b''。

然而,运行测试'a','b'是正常的。

3个回答

8

你需要括号

exec (@sp_str)

如果存储过程不存在,将会显示以下消息:
Msg 2812,级别 16,状态 62,第 1 行 无法找到存储过程 'test'。
不会是“Could not find stored procedure 'test 'a','b''”。
虽然使用SQL注入仍然是个坏主意,但是尝试使用sp_executeSQL和参数,这里讲解了查询计划的重用:如果没有正确使用参数,则将exec更改为sp_executesql不会提供任何好处

3

0

你根本不需要使用任何形式的动态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演示


来自执行

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

@module_name_var

Is the name of a locally defined variable that represents a module name.

This can be a variable that holds the name of a natively compiled, scalar user-defined function.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接