想实现动态调用存储过程,比如有PROC1、PROC2...PROCN,每个存储过程都有自己的输入参数和输出参数,如PARM1 NVARCHAR,PARM2 NVARCHAR OUT,希望在主存储MAINPROC过程中实现传入的存储名称,动态调用相应的存储过程,主存储过程结构如下:
MAINPROC @PROC_NAME NVARCHAR @PARM1 NVARCHAR @PARM2 NVARCHAR OUT
其他存储过程结构如下
PROC1 @PARM1 NVARCHAR @PARM2 NVARCHAR OUT
PROC2 @PARM1 NVARCHAR @PARM2 NVARCHAR OUT
PROC3 @PARM1 NVARCHAR @PARM2 NVARCHAR OUT

PROCN @PARM1 NVARCHAR @PARM2 NVARCHAR OUT
希望在主存储过程中MAINPROC实现动态调用@PROC_NAME指定的过程请大侠们指导,如果根据传入的@PROC_NAME来调用其存储过程,不用if/else奥
高分相送,一有答案解决问题立刻结贴 

解决方案 »

  1.   

    CREATE PROC PROCA
    @P1 nvarchar(50)
    AS
    BEGIN
    SELECT @P1
    END
    CREATE PROC F
    @NAME NVARCHAR(100),
    @P1 nvarchar(50)
    AS
    BEGIN
    EXEC('EXEC '+@NAME+' @P1 = '+@P1)
    END---------------------------
    --调用
    ---------------------------
    EXEC @return_value = [dbo].[F]
    @NAME = N'ProcA',
    @P1 = N'100'
      

  2.   

    是这样不,我做了一个实验,是可以通过sp_executesql来exec存储过程的哈:
    --建表
    if object_id('tb') is not null
       drop table tb
    goselect * into tb
    from sys.objects
    go
    --建存储过程
    if exists(select 1 from sys.procedures where name = 'proc_sp_spaceused')
       drop proc proc_sp_spaceused
    gocreate proc proc_sp_spaceused 
    @objname nvarchar(100)
    asexec sp_spaceused @objname
    go
    --通过sp_executesql来动态调用存储过程
    --模拟了输出参数,输入参数
    declare @sql nvarchar(max);declare @p nvarchar(100);    --输入参数
    declare @i int;              --输出参数set @sql = '';
    set @p = 'tb';   set @sql = 'exec @i = proc_sp_spaceused @p;'
    EXEC sp_executesql @sql,
                       N'@i int out,@p nvarchar(100)',
                       @i OUT,    --输出参数
                       @p         --输入参数
      

  3.   

    try this,--建存储过程1
    create proc PROC1
    (@p11 nvarchar(50),
     @p12 nvarchar(50) output)
    as
    begin
     select @p12=@p11+N' from PROC1.'
    end--建存储过程2
    create proc PROC2
    (@p21 nvarchar(50),
     @p22 nvarchar(50) output)
    as
    begin
     select @p22=@p21+N' from PROC2.'
    end--建存储过程N
    create proc PROCN
    (@pn1 nvarchar(50),
     @pn2 nvarchar(50) output)
    as
    begin
     select @pn2=@pn1+N' from PROCN.'
    end
    --建存储过程MAINPROC
    alter proc MAINPROC
    (@PROC_NAME nvarchar(50),
     @PARM1 nvarchar(50),
     @PARM2 nvarchar(50) output)
    as
    begin
     declare @tsql nvarchar(4000) select b.name,b.is_output
      into #t
      from sys.objects a
      inner join sys.parameters b on a.object_id=b.object_id
      where a.type='P' and a.name=@PROC_NAME select @tsql=N'exec '+@PROC_NAME+N' '
                 +(select top 1 name from #t where is_output=0)+N'=@a1,'
                 +(select top 1 name from #t where is_output=1)+N'=@a2 output' exec sp_executesql @tsql,N'@a1 nvarchar(50),@a2 nvarchar(50) output',@a1=@PARM1,@a2=@PARM2 output
    end
    -- 测试1,调用PROC2
    declare @y nvarchar(50)
    exec MAINPROC @PROC_NAME=N'PROC2',@PARM1=N'测试1',@PARM2=@y output
    select @y 'y'/*
    y
    --------------------------------------------------
    测试1 from PROC2.(1 row(s) affected)
    */
    -- 测试2,调用PROCN
    declare @y nvarchar(50)
    exec MAINPROC @PROC_NAME=N'PROCN',@PARM1=N'唐诗三百首',@PARM2=@y output
    select @y 'y'/*
    y
    --------------------------------------------------
    唐诗三百首 from PROCN.(1 row(s) affected)
    */
    -- 测试3,调用PROC1
    declare @y nvarchar(50)
    exec MAINPROC @PROC_NAME=N'PROC1',@PARM1=N'pililaolang',@PARM2=@y output
    select @y 'y'/*
    y
    --------------------------------------------------
    pililaolang from PROC1.(1 row(s) affected)
    */
      

  4.   

    CREATE PROC PROC1 @PARM1 NVARCHAR(100), @PARM2 NVARCHAR OUT
    AS
    PRINT 'PROC1'
    GOCREATE PROC PROC2 @PARM1 NVARCHAR(100), @PARM2 NVARCHAR OUT
    AS
    PRINT 'PROC2'
    GOCREATE PROC MAINPROC @PROC_NAME NVARCHAR(256), @PARM1 NVARCHAR(100), @PARM2 NVARCHAR OUT
    AS
    EXEC @PROC_NAME --直接用EXEC调用即可
    @PARM1, --参数1
    @PARM2 --参数N
    GO--测试
    EXEC MAINPROC 'PROC1', 'TEST', ''
    EXEC MAINPROC 'PROC2', 'TEST', ''