高分求教一个深奥的存储过程

pililaolang 2013-10-31 05:41:18
想实现动态调用存储过程,比如有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奥
高分相送,一有答案解决问题立刻结贴
...全文
246 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2013-11-01
  • 打赏
  • 举报
回复
CREATE PROC PROC1 @PARM1 NVARCHAR(100), @PARM2 NVARCHAR OUT
AS
	PRINT 'PROC1'
GO

CREATE PROC PROC2 @PARM1 NVARCHAR(100), @PARM2 NVARCHAR OUT
AS
	PRINT 'PROC2'
GO

CREATE 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', ''
唐诗三百首 2013-10-31
  • 打赏
  • 举报
回复
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)
*/
LongRui888 2013-10-31
  • 打赏
  • 举报
回复
引用 楼主 pililaolang 的回复:
想实现动态调用存储过程,比如有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奥 高分相送,一有答案解决问题立刻结贴
是这样不,我做了一个实验,是可以通过sp_executesql来exec存储过程的哈:

--建表
if object_id('tb') is not null
   drop table tb
go

select * into tb
from sys.objects
go


--建存储过程
if exists(select 1 from sys.procedures where name = 'proc_sp_spaceused')
   drop proc proc_sp_spaceused
go

create proc proc_sp_spaceused 
@objname nvarchar(100)
as

exec 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         --输入参数
ai_li7758521 2013-10-31
  • 打赏
  • 举报
回复
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'

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧