【问题标题】:Dynamically call a stored procedure from another stored procedure从另一个存储过程动态调用一个存储过程
【发布时间】:2010-05-31 17:54:00
【问题描述】:

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

具体来说我试过了:

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' 调用过程 test。

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

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

但是,运行 test 'a','b' 工作正常。

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql stored-procedures


    【解决方案1】:

    你需要括号

    exec (@sp_str)
    

    如果 proc 不存在,则消息将是这个

    消息 2812,第 16 级,状态 62,第 1 行 找不到存储过程“测试”。

    不会是找不到存储过程'test'a','b''

    尽管使用 SQL 注入仍然是个坏主意,但请尝试使用 sp_executeSQL 并使用参数,请参阅此处了解查询计划重用:Changing exec to sp_executesql doesn't provide any benefit if you are not using parameters correctly

    【讨论】:

      【解决方案2】:

      您应该使用“sp_executesql”过程。看MSDN - sp_executesql

      【讨论】:

        【解决方案3】:

        您根本不需要任何类型的动态 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


        来自EXECUTE

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

        @module_name_var

        是代表模块名称的本地定义变量的名称。

        这可以是一个包含本地编译的标量用户定义函数名称的变量。

        【讨论】:

          猜你喜欢
          • 2014-09-17
          • 1970-01-01
          • 2010-11-14
          • 2011-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多