Gre*_*reg 6 sql t-sql sql-server stored-procedures sql-server-2005
我希望能够将存储过程的名称作为字符串传递到另一个存储过程,并使用动态参数调用它.我收到了一个错误.
具体来说,我尝试过:
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'
Run Code Online (Sandbox Code Playgroud)
因此,过程call_it应该使用参数'a'和'b'调用过程测试.
当我运行上面的代码时,我得到:
消息2812,级别16,状态62,过程call_it,第6行无法找到存储过程'test'a','b''.
但是,运行测试'a','b'工作正常.
你需要括号
exec (@sp_str)
Run Code Online (Sandbox Code Playgroud)
如果proc不存在,那么消息就是这个
Msg 2812,Level 16,State 62,Line 1 无法找到存储过程'test'.
它不会找不到存储过程'test'a','b''
尽管使用SQL注入仍然是一个坏主意,但请尝试使用sp_executeSQL并使用参数,请参阅此处有关查询计划重用的信息:如果未正确使用参数,则将exec更改为sp_executesql不会带来任何好处