一个高深的问题,高分求答

pililaolang 2013-10-31 05:23:40
想实现动态调用存储过程,比如有PROC1、PROC2...PROCN,每个存储过程都有自己的输入参数和输出参数,如PARM1 NVARCHAR,PARM2 NVARCHAR OUT,希望在主存储MAINPROC过程中实现传入的存储名称,动态调用相应的存储过程,大致如下:
CREATE PROC MAINPROC
@PROC_NAME NVARCHAR
@PARM1 NVARCHAR
@PARM2 NVARCHAR OUT
AS
BEGIN
--根据传入参数@PROC_NAME动态调用其指定的存储过程,好比传入参数为DEALDATA,则调用DEALDATA存储过程

请大侠们指导,高分相送,一有答案解决问题立刻结贴
...全文
298 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2013-11-01
  • 打赏
  • 举报
回复
引用 4 楼 pililaolang 的回复:
存储过程结构都是一样的,都是2个参数:一个输入参数,一个输出参数
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
  • 打赏
  • 举报
回复
引用 4 楼 pililaolang 的回复:
存储过程结构都是一样的,都是2个参数:一个输入参数,一个输出参数
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
  • 打赏
  • 举报
回复
引用 9 楼 pililaolang 的回复:
因为客户是随意调用的,没法写出执行逻辑来 其实本意很简单,就是通过MAINPROC执行客户想要调用的存储过程
是这样不,我做了一个实验,是可以通过sp_executesql来调用动态的存储过程的哈:

--建表
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         --输入参数
pililaolang 2013-10-31
  • 打赏
  • 举报
回复
因为客户是随意调用的,没法写出执行逻辑来 其实本意很简单,就是通过MAINPROC执行客户想要调用的存储过程
水族杰纶 2013-10-31
  • 打赏
  • 举报
回复
我觉得 既然所有的子过程都一样的参数 可以将这些过程改成一个 执行的逻辑放到一个过程 而不是N过过程
pililaolang 2013-10-31
  • 打赏
  • 举报
回复
大侠能帮我写出来吗,给点案例也可以,网上捜出来的基本都是SELECT * 类型的,如 http://blog.csdn.net/carrousel0516/article/details/4774951 http://www.cnblogs.com/edobnet/archive/2004/11/10/62155.html 实在不知道如何写存储过程的
水族杰纶 2013-10-31
  • 打赏
  • 举报
回复
引用 3 楼 pililaolang 的回复:
不能用if/else来实现,因为要调用的存储过程太多,没法一一写if/else,希望类似 EXEC sp_executesql @sql,N'@p AS INT OUTPUT',@p = @i OUTPUT 但@sql只能是select语句,不知道如何实现调用存储过程
也可以执行存储过程
發糞塗牆 2013-10-31
  • 打赏
  • 举报
回复
如果存储过程很多,你可以独立见一个表来存放,然后加写列来存放参数,然后直接拼接这个表
pililaolang 2013-10-31
  • 打赏
  • 举报
回复
存储过程结构都是一样的,都是2个参数:一个输入参数,一个输出参数
pililaolang 2013-10-31
  • 打赏
  • 举报
回复
不能用if/else来实现,因为要调用的存储过程太多,没法一一写if/else,希望类似 EXEC sp_executesql @sql,N'@p AS INT OUTPUT',@p = @i OUTPUT 但@sql只能是select语句,不知道如何实现调用存储过程
唐诗三百首 2013-10-31
  • 打赏
  • 举报
回复
每个存储过程都有自己的输入参数和输出参数, 但主存储过程MAINPROC只有2个参数的参数,如果有存储过程是3个参数的怎么处理呢? @PARM1 NVARCHAR @PARM2 NVARCHAR OUT
發糞塗牆 2013-10-31
  • 打赏
  • 举报
回复
你现在难点在哪里?用if/else来判断参数的输入情况然后动态拼接即可

22,300

社区成员

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

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