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

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存储过程

请大侠们指导,高分相送,一有答案解决问题立刻结贴
...全文
299 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来判断参数的输入情况然后动态拼接即可
IOSIOSiOS基于百度地图SDK记录运动轨迹,求大神们给个demo!急急急 要使敌人处于绝境,不可以派兵与敌人发生正面交锋,而是逐步的削弱敌人尚存力量,使敌人逐渐变弱。 匿名发表0人评论99人浏览0收藏 1个回答 0 寒凝雪 要使敌人处于绝境,不可以派兵与敌人发生正面交锋,而是逐步的削弱敌人尚存力量,使敌人逐渐变弱。 0人评论发布于2018-08-03 11:17:27 登录后可回答问题,请 登录 或 注册 等你来答 ios 调起地图app导航 demo 目的地名怎么修改如何在eclipse里面应用高德地图demo android开发求一份百度地图的demo Android studio 启动一直提示Fetchin… 高分求取Android下基于百度地图api的实现地图,定… 请问iOS 百度地图轨迹回放--轨迹是有了(一条线),但… 百度地图sdk demo 怎么使用 android开发怎么修改百度地图sdk demo的固定… ios百度地图demo为什么运行不了 百度富文本 UEditor config.json中怎么… 看了该问题的人还看了 常用API接口汇总 Android 百度鹰眼轨迹SDK(v2.1.6) Phab2 Pro体验 & Tango技术简介 Android 百度地图周边雷达(v6.1.3)及覆盖物 解析百度Apollo自动驾驶平台 Android 百度定位SDK(v6.1.3)结合方向传… [android] 百度地图开发 (三).定位当前位置及… 大牛讲堂|SLAM最终话:视觉里程计 基于OpenLayers+rbush实现高德轨迹样式 [android] 百度地图开发 (一).申请AK显示地… 99 浏览 0 收藏
还在为答辩发愁? 熬夜改PPT?怕被导师怼到自闭? 别慌!这份「答辩通关模板」让你稳过! 为什么你需要这份答辩指南? 15个高频问题+标准答案——导师最爱问的,我们都帮你整理好了! 万能道歉话术——被提问不会答?直接套模板,优雅化解尴尬! 逻辑清晰的答辩框架——从自我介绍到总结,照着说就能拿高分! 适用于任何专业——文科/理科/工科,统统能用! 适合谁用? 答辩在即,但还没准备好的同学 怕临场发挥不好,想要提前演练的人 想轻松过关,不被导师刁难的毕业生 模板内容预览 1. 自我介绍(直接套用,稳拿印象分) "尊敬的各位老师上午好,我是XX级XX专业的XXX,我的论文题目是《XXXX》……" 2. 研究背景与意义(3句话讲清楚,导师点头认可) "近年来XX问题备受关注,但现有研究存在XX不足,因此本文……" 3. 论文框架(逻辑清晰,让导师眼前一亮) "本文分为五个部分:背景分析→理论基础→问题研究→解决方案→结论展望……" 4. 创新点与不足(巧妙表达,展现学术严谨) "本文创新在于XX方法的应用,但由于数据限制,仍有改进空间……" 5. 答辩话术(15个高频问题+标准答案) 导师问:"为什么选这个题目?" 标准答:"谢谢老师提问,我在查阅文献时发现XX领域研究较少……" 6. 万能道歉模板(被怼也不慌) "感谢老师指正,这个问题确实是我考虑不周,会后我会进一步完善……"

22,300

社区成员

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

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