| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2334 人关注过本帖
标题:可以对存储过程的返回集再进行汇总查询吗?
只看楼主 加入收藏
小水滴
Rank: 1
等 级:新手上路
威 望:2
帖 子:227
专家分:0
注 册:2006-8-22
结帖率:100%
收藏
 问题点数:0 回复次数:12 
可以对存储过程的返回集再进行汇总查询吗?
我曾建立了一个存储过程Pa, 这个存储过程是对多表进行查询。例:
create prpcedure Pa
as
select a.aa,b.bb,c.cc
from a join b on a.ID=b.ID
join c on a.ID=c.ID

现在我想再建个存储过程Pb, 在这个存储过程中要调用存储过程Pa,对它的返回集再进行汇总查询:
create prpcedure Pb
as
exec Pa


接下来该如何编写?请教各位高手,先谢谢了!
搜索更多相关主题的帖子: 汇总 查询 
2006-08-22 15:42
小水滴
Rank: 1
等 级:新手上路
威 望:2
帖 子:227
专家分:0
注 册:2006-8-22
收藏
得分:0 
这个问题大概不常用吧, 没人知道吗?

版主快来给点提示啊!

[此贴子已经被作者于2006-8-29 14:07:14编辑过]


2006-08-27 12:09
小水滴
Rank: 1
等 级:新手上路
威 望:2
帖 子:227
专家分:0
注 册:2006-8-22
收藏
得分:0 

千呼万唤不出来!

[此贴子已经被作者于2006-9-3 8:48:03编辑过]


2006-09-02 22:01
小水滴
Rank: 1
等 级:新手上路
威 望:2
帖 子:227
专家分:0
注 册:2006-8-22
收藏
得分:0 
问题已初步解决. (使用临时表)

但仍有第二个问题: 如果我想再创建第三个存储过程 Pc ,再对 存储过程 Pb 进行汇总, 出来提示:不能嵌套.

谁有更好的方法, 请指点一下,谢谢!

2006-09-03 08:46
kitter520
Rank: 1
等 级:新手上路
威 望:1
帖 子:21
专家分:0
注 册:2006-9-1
收藏
得分:0 
我剛試了下 沒報錯 要不你把你寫的發上來看看
或者你使多個用臨時表 把后面的 proc 全放在第1個proc里面
2006-09-04 15:19
小水滴
Rank: 1
等 级:新手上路
威 望:2
帖 子:227
专家分:0
注 册:2006-8-22
收藏
得分:0 

由于前面的存储过程要多次应用在不同的场合,所以不能把后面的 proc 全放在第1個proc里面.

下面是代码(表和记录只是做测试用的):

--创建表
CREATE TABLE [bxhz]
([年月] varchar(10) ,
[科目] varchar (50) ,
[明细科目] varchar (50) ,
[支出] numeric (18, 2),
[报销人] varchar (20) )
GO

--添加记录
insert into bxhz
values('2006-01','经营费用','通讯费',100,'王丽')
insert into bxhz
values('2006-01','经营费用','差旅费',1500,'张华')
insert into bxhz
values('2006-01','经营费用','通讯费',550,'何军')
insert into bxhz
values('2006-01','经营费用','差旅费',2000,'刘伟')
insert into bxhz
values('2006-01','管理费用','工资',2000,'何军')
insert into bxhz
values('2006-01','管理费用','工资',3000,'张华')
insert into bxhz
values('2006-01','管理费用','其它',1000,'刘伟')
insert into bxhz
values('2006-01','管理费用','其它',400,'王丽')
insert into bxhz
values('2006-02','经营费用','通讯费',100,'王丽')
insert into bxhz
values('2006-02','经营费用','差旅费',1500,'张华')
insert into bxhz
values('2006-02','经营费用','通讯费',550,'何军')
insert into bxhz
values('2006-02','经营费用','差旅费',2000,'刘伟')
insert into bxhz
values('2006-02','管理费用','工资',2000,'何军')
insert into bxhz
values('2006-02','管理费用','工资',3000,'张华')
insert into bxhz
values('2006-02','管理费用','其它',1000,'刘伟')
insert into bxhz
values('2006-02','管理费用','其它',400,'王丽')

--创建第一个存储过程 Pa
create procedure Pa
as
begin
select 年月,科目,明细科目,sum(支出) as 支出 from bxhz group by 年月,科目,明细科目
end

--创建第二个存储过程 Pb
create procedure Pb
as
begin
create table #Pb2
([年月] varchar(10) ,
[科目] varchar (50) ,
[明细科目] varchar (50) ,
[支出] numeric (18, 2),
)
insert into #Pb2
exec Pa

select 年月,科目,sum(支出) as 支出 from #Pb2 group by 年月,科目
end

--创建第三个存储过程 Pc
create procedure Pc
as
begin
create table #Pc3
([年月] varchar(10) ,
[科目] varchar (50) ,
[支出] numeric (18, 2),
)
insert into #Pc3
exec Pb

select 年月, sum(支出) as 支出 from #Pc3 group by 年月
end

--调用:
exec pc

报错:insert exec 语句不能嵌套

是不是我什么地方用的不对,请楼上先生指点一下.


[此贴子已经被作者于2006-9-4 16:32:46编辑过]


2006-09-04 16:31
kitter520
Rank: 1
等 级:新手上路
威 望:1
帖 子:21
专家分:0
注 册:2006-9-1
收藏
得分:0 
按照你那樣做﹐問題﹕
伺服器: 訊息 8164,層級 16,狀態 1,程序 Pb,行 10
INSERT EXEC 陳述式不可以是巢狀的。
它說INSERT EXEC不能嵌套﹐就是說 Pc中有EXEC Pb中就不能有insert
所以你那種方法只能執行1次

--创建第一个存储过程 Pa
if exists(select * from dbo.sysobjects where id=object_id(N'[dbo].[Pc3]') and OBJECTPROPERTY(id,N'IsUserTable')=1)
drop table Pc3
create procedure Pa
as
begin
select 年月,科目,明細科目,sum(支出) as 支出
into Pa1
from bxhz group by 年月,科目,明細科目
exec Pb
exec Pc
drop table Pa1
drop table Pb2
end
--创建第二个存储过程 Pb
create procedure Pb
as
begin
select 年月,科目,sum(支出) as 支出
into Pb2
from Pa1
group by 年月,科目
-- select 年月,科目,sum(支出) as 支出 from #Pb2 group by 年月,科目
end
--创建第三个存储过程 Pc
create procedure Pc
as
begin
select 年月,sum(支出) as 支出
into Pc3
from Pb2
group by 年月
end

[此贴子已经被作者于2006-9-5 10:32:09编辑过]

2006-09-05 10:28
小水滴
Rank: 1
等 级:新手上路
威 望:2
帖 子:227
专家分:0
注 册:2006-8-22
收藏
得分:0 
楼上先生的意思是利用存储过程把汇总的结果存入一个真实的表里(Pa,Pb,Pc),然后从表中读取数据.

这又产生了一个多人同时调用存储过程的问题,假设用户A调用了存储过程Pa,产生了一个Pa表,那么用户B也调用存储过程Pa时,还能再产生一个同名的Pa表吗?

与楼上先生探讨.....

2006-09-05 11:34
kitter520
Rank: 1
等 级:新手上路
威 望:1
帖 子:21
专家分:0
注 册:2006-9-1
收藏
得分:0 

把它寫到事物里面就沒沒并發了
或者用全局臨時表。但有并發﹐所以先要判斷改表存不存在。如果存在﹐直接利用﹐
不存在就創建(思路)。你那樣做太復雜了﹐﹐我沒想出來。等待ing.............答案
2006-09-07 09:50
volte
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:69
帖 子:1167
专家分:1316
注 册:2004-12-19
收藏
得分:0 

insert是不能用嵌套的
你的存储过程当然用了嵌套了
pb3要调用pb2,pb2要调用pb1
每次都要执行一下insert
最好是把存储过程尽量的缩减。

存储过程百来行的程序很正常的。


大家都是朋友,有空就来坐坐!
2006-09-08 11:25
快速回复:可以对存储过程的返回集再进行汇总查询吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023616 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved