22,209
社区成员
发帖
与我相关
我的任务
分享
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', ''
--建存储过程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)
*/
--建表
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 --输入参数
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'