存储过程调用存储过程

笑虾 2009-10-25 02:31:57

ALTER PROCEDURE [dbo].[按单统计]

@单据 AS nvarchar(50),
@明细 AS nvarchar(50),
@开始时间 AS datetime = '2007-01-01 00:00:00',
@结束时间 AS datetime = NULL, --怎么调默认为当前时间?
@单据类别 AS nvarchar(50) --默认为任务字符都可以

AS
BEGIN

IF(@结束时间 IS NULL)
SET @结束时间 = GETDATE();

declare @sql nvarchar(1000)

SET @sql = 'SELECT dbo.商品信息.货物编号, ISNULL(统计.数量, 0) AS 数量
FROM (SELECT [dbo].['+@明细+'].货物编号, SUM([dbo].['+@明细+'].数量) AS 数量
FROM [dbo].['+ @单据 +'] INNER JOIN [dbo].['+ @明细+'] ON [dbo].['+ @单据 +'].单号 = [dbo].['+@明细+'].单号
WHERE ([dbo].['+ @单据 +'].通知时间 >= ''' +CONVERT(nvarchar(50),@开始时间, 120)+''')
AND ([dbo].['+ @单据 +'].通知时间 <= '''+ CONVERT(nvarchar(50),@结束时间, 120)+''')
AND (dbo.销售出库单.单据类别 = '''+ CONVERT(nvarchar(50),@单据类别, 120)+''')

GROUP BY [dbo].['+ @明细 +'].货物编号)AS 统计 RIGHT OUTER JOIN
dbo.商品信息 ON 统计.货物编号 = dbo.商品信息.货物编号
ORDER BY dbo.商品信息.排序码'

exec(@sql)

END


我想建一个存储过程,用来调用 上面例出的这个 存储过程。大概要调用20次,把20次反回的结果集分别写入20个临时表里。
如 Temp销售出库单、Temp包装出料单 等等
这个应该怎么实现?
...全文
228 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
笑虾 2009-10-29
  • 打赏
  • 举报
回复
晕,没人说了
nianran520 2009-10-26
  • 打赏
  • 举报
回复

ALTER PROCEDURE [dbo].[调用按单统计]
@单据 AS nvarchar(50)= '销售出库单',
@开始时间 AS datetime = '2007-01-01 00:00:00',
@结束时间 AS datetime = NULL, --怎么调默认为当前时间?
@单据类别 AS nvarchar(50) = 'A' --默认为任务字符都可以
AS
declare @i int,@table nvarchar(40),@s nvarchar(3000)
set @i = 1
while @i <= 1
begin
--设置表名变量
select @table = '销售出库单_temp'+convert(char(2),@i)
select @table = @单据 + 'temp'

-------------------------先查是否存在,有的话就先删了再说------------------
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['+@table+']') AND type in (N'U'))
exec('DROP TABLE [dbo].['+@table+']')
------------------------建空表-------------------------------------------------
select @s = 'select * into '+@table+' from dbo.统计模表 where 1<>1'
exec(@s)
--------------------------写入数据-------------------------------------------
select @s = 'insert into '+@table+' exec [dbo].[按单统计]'+@单据+','''+CONVERT(nvarchar(50),@开始时间, 120)+''','''+CONVERT(nvarchar(50),@结束时间, 120)+''','+@单据类别 +''
--exec(@s)
PRINT (@s)--看出来的是什么,复制在查询分析器执行
-------------------------递加变量---------------------------------------------
select @i = @i+1
end
笑虾 2009-10-26
  • 打赏
  • 举报
回复
对了有没有人能说一下那个临时表的问题啊。为什么我生成的不能用?
笑虾 2009-10-26
  • 打赏
  • 举报
回复
不好意思下午实在太睏,睡着了~~~~~~~
[Quote=引用 16 楼 nianran520 的回复:]
测试了一下,可行
SQL codedeclare@iint,@tablenvarchar(40),@snvarchar(3000)set@i=1while@i<=20beginselect@table='销售出库单_temp'+convert(char(2),@i)select@s='select * into'+@table+' from dbo.student_info where 1<>1'exec(@s)select@s='insert into'+@table+' exec [dbo].[按单统计]'+@单据+','+@明细+''exec(@s)select@i=@i+1end
[/Quote]

我用while 建20个表实现了,但是都没有写进数据。
我去了循环用单个的也是一样,一直显示在查寻。

另外,我是想生成20种不同单据的统计数据。有什么办法能把二十个单据表的名称放在数组里给循环来处理吗?
然后把数据合并在一个表中:
我要的最终效果如下:

货物编号 采购入库 采购退货 销售出库 销售退货 包装出料 包装转入 领用出 领用退回 结余
大力丸001 234 1 100 25 234 234 2 1 157
大力丸002 23 23 100 26 23 23 2 1 -75
大力丸003 234 5 100 27 234 234 2 1 155
大力丸004 234 3 100 28 234 234 2 1 158
大力丸005 234 3 100 29 234 234 2 1 159
大力丸006 234 9 100 30 234 234 2 1 154
大力丸007 534 4 100 31 534 534 2 1 460
大力丸008 234 2 100 32 234 234 2 1 163
大力丸009 672 4 100 33 672 672 2 1 600
大力丸010 345 1 100 34 345 345 2 1 277


列出我现在测试的:

ALTER PROCEDURE 调用按单统计
@单据 AS nvarchar(50)= '销售出库单',
@开始时间 AS datetime = '2007-01-01 00:00:00',
@结束时间 AS datetime = NULL, --怎么调默认为当前时间?
@单据类别 AS nvarchar(50) = 'A' --默认为任务字符都可以
AS
declare @i int,@table nvarchar(40),@s nvarchar(3000)
set @i = 1
while @i <= 20
begin
--设置表名变量-------------------------------------------------------------
select @table = '销售出库单_temp'+convert(char(2),@i
--先查是否存在,有的话就先删了再说-----------------------------------------
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['+@table+']') AND type in (N'U'))
exec('DROP TABLE [dbo].['+@table+']')
--建空表---------------------------------------------------------------
select @s = 'select * into '+@table+' from dbo.统计模表 where 1<>1'
exec(@s)
--写入数据-------------------------------------------------------------
select @s = 'insert into '+@table+'exec [dbo].[按单统计]'+@单据+','''+CONVERT(nvarchar(50),@开始时间, 120)+''','''+CONVERT(nvarchar(50),@结束时间, 120)+''','+@单据类别 +''
exec(@s)
--递加变量-----------
select @i = @i+1
end
GO


谢谢各位
笑虾 2009-10-26
  • 打赏
  • 举报
回复
是不是因为 存储过程 返回的不是表所以没法用 insert into 啊?
如果这样。怎么办?在“按单统计”中生成临时表了?
笑虾 2009-10-26
  • 打赏
  • 举报
回复
就是如下这种效果了。
第一例是货物编号,后面分别是各种单据的汇总,然后按单的业务逻辑是增加库存还是减少库存来得出结余(我现在的实际操作中应该有20种单的,不全列出来了):

货物编号 采购入库 - 采购退货 - 销售出库 + 销售退货 - 包装出料 + 包装转入 - 领用出 + 领用退回 = 结余

二十个一样数据的当然就没意义了。

不好意思
select @table = '销售出库单_temp'+convert(char(2),@i)
这里少括号是发帖的手误,代码里有的。

Ken你看下你说的是不是这样测试:
ALTER PROCEDURE [dbo].[调用按单统计]
@单据 AS nvarchar(50)= '销售出库单',
@开始时间 AS datetime = '2007-01-01 00:00:00',
@结束时间 AS datetime = NULL, --怎么调默认为当前时间?
@单据类别 AS nvarchar(50) = 'A' --默认为任务字符都可以
AS
declare @i int,@table nvarchar(40),@s nvarchar(3000)
set @i = 1
while @i <= 1
begin
--设置表名变量
select @table = '销售出库单_temp'+convert(char(2),@i)
select @table = @单据 + 'temp'

-------------------------先查是否存在,有的话就先删了再说------------------
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['+@table+']') AND type in (N'U'))
exec('DROP TABLE [dbo].['+@table+']')
------------------------建空表-------------------------------------------------
select @s = 'select * into '+@table+' from dbo.统计模表 where 1<>1'
exec(@s)
--------------------------写入数据-------------------------------------------
select @s = 'PRINT insert into 销售出库单temp exec [dbo].[按单统计]'+@单据+','''+CONVERT(nvarchar(50),@开始时间, 120)+''','''+CONVERT(nvarchar(50),@结束时间, 120)+''','+@单据类别 +''
--exec(@s)
PRINT (@s)
-------------------------递加变量---------------------------------------------
select @i = @i+1
end


结果是: 0
消息是:(0 行受影响)
(1 行受影响)
笑虾 2009-10-26
  • 打赏
  • 举报
回复
##销售出库单_temp
这样就可以

对临时表一窍不通。我得先看点资料。
那怎么让循环 生成20个不同的表啊

@单据 = N'销售出库单'

这个东西。
20次 分别把20个表的名称赋给它让它来一个一个的调用 “按单统计”存储过程,生成 二十种单的汇总表(也就是20个临时表。)
然后再把20个表连起来。:
货物编号 采购入库 采购退货 销售出库 销售退货 包装出料 包装转入 领用出 领用退回 结余
大力丸001 234 1 100 25 234 234 2 1 157
大力丸002 23 23 100 26 23 23 2 1 -75
大力丸003 234 5 100 27 234 234 2 1 155
大力丸004 234 3 100 28 234 234 2 1 158
大力丸005 234 3 100 29 234 234 2 1 159
大力丸006 234 9 100 30 234 234 2 1 154
大力丸007 534 4 100 31 534 534 2 1 460
大力丸008 234 2 100 32 234 234 2 1 163
大力丸009 672 4 100 33 672 672 2 1 600
大力丸010 345 1 100 34 345 345 2 1 277

计算公式是:
货物编号:采购入库 - 采购退货 - 销售出库 + 销售退货 - 包装出料 + 包装转入 - 领用出 + 领用退回 = 结余

nianran520 2009-10-26
  • 打赏
  • 举报
回复
貌似临时表不能用动态语句生成
笑虾 2009-10-26
  • 打赏
  • 举报
回复
用这个测试成功了。晕。现在工作中,晚点有空了再研究。
还有就是 如果我把:
把 “销售出库单_temp“ 换成 '#销售出库单_temp'
想用来生成临时表就告诉我

(0 行受影响)
消息 208,级别 16,状态 0,第 1 行
对象名 '#销售出库单_temp' 无效。



--insert into 销售出库汇总

declare @s nvarchar(3000)
declare @table nvarchar(50)
SET @table = '销售出库单_temp'

declare @单据 nvarchar(50)
SET @单据 = N'销售出库单'

declare @开始时间 nvarchar(50)
SET @开始时间 = N'2007-1-1'

declare @结束时间 nvarchar(50)
SET @结束时间 = N'2009-10-25'

declare @单据类别 nvarchar(50)
SET @单据类别 = N'A'

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['+@table+']') AND type in (N'U'))
exec('DROP TABLE [dbo].['+@table+']')
------------------------建空表-------------------------------------------------
select @s = 'select * into '+@table+' from dbo.统计模表 where 1<>1'
exec(@s)

select @s = 'insert into '+@table+' exec [dbo].[按单统计]'+@单据+','''+CONVERT(nvarchar(50),@开始时间, 120)+''','''+CONVERT(nvarchar(50),@结束时间, 120)+''','+@单据类别 +''
exec(@s)
笑虾 2009-10-26
  • 打赏
  • 举报
回复
输出:
insert into 销售出库单_temp exec [dbo].[按单统计]销售出库单,'2007-1-1','2009-10-25',A
nianran520 2009-10-26
  • 打赏
  • 举报
回复

--你写得有问题,改成这样
select @s = 'insert into '+@table+' exec [dbo].[按单统计] '''+@单据+''','''+CONVERT(nvarchar(50),@开始时间, 120)+''','''+isnull(CONVERT(nvarchar(50),@结束时间, 120),'')+''','''+@单据类别 +''''
taoistong 2009-10-26
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 jx520 的回复:]
在查寻分析里 运行:
结果:

(0 行受影响)
[/Quote]

说明你存储过程的问题了。
前面临时表的做法可以的
nianran520 2009-10-26
  • 打赏
  • 举报
回复

select @s = 'insert into '+@table+' exec [dbo].[按单统计]'+@单据+','''+CONVERT(nvarchar(50),@开始时间, 120)+''','''+CONVERT(nvarchar(50),@结束时间, 120)+''','+@单据类别 +''

print 得出来吗,好像写法有问题
nianran520 2009-10-26
  • 打赏
  • 举报
回复
这样20个表生成的数据是一样的
select @table = '销售出库单_temp'+convert(char(2),@i
少了个括号
select @s = 'insert into '+@table+' exec [dbo].[按单统计]'+@单据+','''+CONVERT(nvarchar(50),@开始时间, 120)+''','''+CONVERT(nvarchar(50),@结束时间, 120)+''','+@单据类别 +''
这里PRINT出来单独执行看看有没有数据生成
不大清楚你要达到什么效果,能说清楚点吗
笑虾 2009-10-26
  • 打赏
  • 举报
回复
在查寻分析里 运行:
结果:

(0 行受影响)
xingyouke 2009-10-25
  • 打赏
  • 举报
回复
呵呵呵
nianran520 2009-10-25
  • 打赏
  • 举报
回复

dbo.student_info 为格式表,你建一个格式一样的
nianran520 2009-10-25
  • 打赏
  • 举报
回复
测试了一下,可行

declare @i int,@table nvarchar(40),@s nvarchar(3000)
set @i = 1
while @i <= 20
begin
select @table = '销售出库单_temp'+convert(char(2),@i)

select @s = 'select * into '+@table+' from dbo.student_info where 1<>1'
exec(@s)
select @s = 'insert into '+@table+' exec [dbo].[按单统计] '+@单据+','+@明细+''
exec(@s)
select @i = @i+1
end

navy887 2009-10-25
  • 打赏
  • 举报
回复
看看我建的表字段够不够,不够的话,你自己把字段加全
create table #temp销售出库单 (单据 varchar(2000),明细 varchar(2000),单据类别 varchar(2000)) 
insert #temp销售出库单
EXEC [dbo].[按单统计]
@单据 = N'销售出库单',
@明细 = N'销售出库单明细',
@单据类别 = N'Y'
GO
笑虾 2009-10-25
  • 打赏
  • 举报
回复
为什么 生成的临时表都是

dbo.#temp销售出库单___________________________________________________000000000000CC

这种样子的?这个怎么调用它啊
用 dbo.[#temp销售出库单] 不行。 说对象名无效
加载更多回复(13)

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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