存储过程返回数据集

net_xiaojian 2011-09-19 12:09:07

比如存储过程a调用存储过程b

存储a里面有:
exec proc b --执行b需要返回数据集(临时表)在存储a里面使用


最后存储a也要返回数据集

最后执行存储a的时候返回的数据就有2个数据集了,我只想要存储a返回的数据集,不要exec proc b的数据集。

...全文
552 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
aarenhandsome 2012-09-12
  • 打赏
  • 举报
回复
有类似的问题
net_xiaojian 2011-09-19
  • 打赏
  • 举报
回复

--调用下列存储过程生成临时表##tmp_saveFloatRainfallPlus
--用于和临时表##tmp_saveFloatRainfallTime合并成一个表
exec dbo.[proc_getFloatRainfallPlus]

declare @strsql nvarchar(4000)
declare @curTime datetime
set @curTime=GETDATE()
--set @curTime='2011-09-18 7:43:09'

declare @timestampHH int --时间戳
select @timestampHH=DATEPART(HH,@curTime)

--debug
--exec dbo.proc_getFloatRainfall @stcd,'today',@todayRain output,'0.0'
--exec dbo.proc_getFloatRainfall @stcd,'yestoday','0.0',@yestodayRain output

set @strsql=''
if(@timestampHH>=8)
begin
declare @lastest24Hour_big8_f nvarchar(500)
declare @lastest24Hour_big8_b nvarchar(500)
declare @starti int
declare @endi int
set @starti=8
set @endi=7

while @starti<=23
begin
set @lastest24Hour_big8_f=ISNULL(@lastest24Hour_big8_f+',','')
+'ISNULL(p'+convert(varchar(2),@starti)+',0) p'+CONVERT(varchar(2),@starti)
set @starti=@starti+1
end
set @lastest24Hour_big8_f=@lastest24Hour_big8_f+',p0=0,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0'
set @strsql='select STCD,'+@lastest24Hour_big8_f+' from st_rain_s where convert(varchar(10),TM,120)='''+convert(varchar(10),@curTime,120)+''''

insert into ##tmp_saveFloatRainfallTime
exec sp_executesql @strsql
set @strsql=''

while @endi>=0
begin
set @lastest24Hour_big8_b=ISNULL(@lastest24Hour_big8_b+',','')
+'ISNULL(p'+convert(varchar(2),@endi)+',0) p'+CONVERT(varchar(2),@endi)
set @endi=@endi-1
end

set @lastest24Hour_big8_b=@lastest24Hour_big8_b+',p8=0,p9=0,p10=0,p11=0,p12=0,p13=0,p14=0,p15=0,p16=0,p17=0,p18=0,p19=0,p20=0,p21=0,p22=0,p23=0'
set @strsql='select STCD,'+@lastest24Hour_big8_b+' from st_rain_s where convert(varchar(10),TM,120)='''+convert(varchar(10),dateadd(day,1,@curTime),120)+''''

insert into ##tmp_saveFloatRainfallTime
exec sp_executesql @strsql

--debug
--print @strSql
end
else
begin
declare @lastest24Hour_less8_f nvarchar(500)
declare @lastest24Hour_less8_b nvarchar(500)
declare @starti1 int
declare @endi1 int
set @starti1=8
set @endi1=0

while @starti1<=23
begin
set @lastest24Hour_less8_f=ISNULL(@lastest24Hour_less8_f+',','')
+'ISNULL(p'+convert(varchar(2),@starti1)+',0) p'+CONVERT(varchar(2),@starti1)
set @starti1=@starti1+1
end
set @lastest24Hour_less8_f=@lastest24Hour_less8_f+',p0=0,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0'
set @strsql='select STCD,'+@lastest24Hour_less8_f+' from st_rain_s where convert(varchar(10),TM,120)='''+CONVERT(varchar(10),dateadd(day,-1,@curTime),120)+''''

insert into ##tmp_saveFloatRainfallTime
exec sp_executesql @strsql
set @strsql=''

while @endi1<=7
begin
set @lastest24Hour_less8_b=ISNULL(@lastest24Hour_less8_b+',','')
+'ISNULL(p'+convert(varchar(2),@endi1)+',0) p'+CONVERT(varchar(2),@endi1)
set @endi1=@endi1+1
end

set @lastest24Hour_less8_b='p8=0,p9=0,p10=0,p11=0,p12=0,p13=0,p14=0,p15=0,p16=0,p17=0,p18=0,p19=0,p20=0,p21=0,p22=0,p23=0,'+@lastest24Hour_less8_b
set @strsql='select STCD,'+@lastest24Hour_less8_b+' from st_rain_s where convert(varchar(10),TM,120)='''+convert(varchar(10),@curTime,120)+''''

insert into ##tmp_saveFloatRainfallTime
exec sp_executesql @strsql

--debug
--print @strSql
end

--临时表数据集合并
IF object_id('[tempdb]..##tmp_saveFloatRainfallPlus') IS NOT NULL
select t.STCD
,a.stName
,(select [name] from adcd_code where adcd=(select adcd from stcd_info where stcd=t.STCD)) as area
,t.todayRain,t.yestodayRain, ISNULL(o.p8,0) p8,ISNULL(o.p9,0) p9,ISNULL(o.p10,0) p10,ISNULL(o.p11,0) p11,ISNULL(o.p12,0) p12,ISNULL(o.p13,0) p13,ISNULL(o.p14,0) p14,ISNULL(o.p15,0) p15,ISNULL(o.p16,0) p16,ISNULL(o.p17,0) p17,ISNULL(o.p18,0) p18,ISNULL(o.p19,0) p19,ISNULL(o.p20,0) p20,ISNULL(o.p21,0) p21,ISNULL(o.p22,0) p22,ISNULL(o.p23,0) p23,ISNULL(o.p0,0) p0,ISNULL(o.p1,0) p1,ISNULL(o.p2,0) p2,ISNULL(o.p3,0) p3,ISNULL(o.p4,0) p4,ISNULL(o.p5,0) p5,ISNULL(o.p6,0) p6,ISNULL(o.p7,0) p7
from (select STCD,SUM(todayRain) todayRain,SUM(yestodayRain) yestodayRain from ##tmp_saveFloatRainfallPlus group by STCD) t
left join
(select STCD,SUM(p8) p8,SUM(p9) p9,SUM(p10) p10,SUM(p11) p11,SUM(p12) p12,SUM(p13) p13,SUM(p14) p14,SUM(p15) p15,SUM(p16) p16,SUM(p17) p17,SUM(p18) p18,SUM(p19) p19,SUM(p20) p20,SUM(p21) p21,SUM(p22) p22,SUM(p23) p23,SUM(p0) p0,SUM(p1) p1,SUM(p2) p2,SUM(p3) p3,SUM(p4) p4,SUM(p5) p5,SUM(p6) p6,SUM(p7) p7 from ##tmp_saveFloatRainfallTime group by STCD) o on o.STCD=t.STCD
left join stcd_info a
on t.STCD=a.stcd

end

/*
存储过程最后我是使用了select 返回数据集,
问题是出在第3行: exec dbo.[proc_getFloatRainfallPlus] (返回的是##临时表),这里主要调用其他存储过程返回数据用于在当前存储过程使用,如果不返还##临时表,在当前存储过程创建#临时表,这样做会出现insert exec嵌套异常,怎么解决了?
*/

Mr_Nice 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]

都放进临时表中去.
存储a插入A表.
存储b插入B表.
[/Quote]

+
-晴天 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 net_xiaojian 的回复:]
3楼方法我知道,存储过程里面我使用了多次插入数据,所以会报 insert exec不能嵌套异常。
[/Quote]

在嵌套存储过程B中,你可以使用临时表收集数据,最后用一句 select 语句返回.
-晴天 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 net_xiaojian 的回复:]
引用 4 楼 qianjin036a 的回复:
引用 2 楼 net_xiaojian 的回复:
SQL code

详细介绍下:
存储过程 proc b
/*
里面有个全局临时表##b,该表主要在存储过程a里面作为临时被使用
*/

那什么时候使用全局临时表合适?[/Quote]
基本不存在并发的时候.
net_xiaojian 2011-09-19
  • 打赏
  • 举报
回复
3楼方法我知道,存储过程里面我使用了多次插入数据,所以会报 insert exec不能嵌套异常。
net_xiaojian 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qianjin036a 的回复:]
引用 2 楼 net_xiaojian 的回复:
SQL code

详细介绍下:
存储过程 proc b
/*
里面有个全局临时表##b,该表主要在存储过程a里面作为临时被使用
*/

存储过程 proc a
/*
首先的执行存储过程b,所以有 exec proc b操作,这个操作后##b表肯定是有数据的,
存储过程a最后面有select ... 返回数据,但是最后面执行……
[/Quote]

那什么时候使用全局临时表合适?
-晴天 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 net_xiaojian 的回复:]
SQL code

详细介绍下:
存储过程 proc b
/*
里面有个全局临时表##b,该表主要在存储过程a里面作为临时被使用
*/

存储过程 proc a
/*
首先的执行存储过程b,所以有 exec proc b操作,这个操作后##b表肯定是有数据的,
存储过程a最后面有select ... 返回数据,但是最后面执行 exec proc a的时候返回的数据是2个数据集……
[/Quote]
不要用全局临时表,采用3楼的那种做法.
-晴天 2011-09-19
  • 打赏
  • 举报
回复
create table #t(存储B返回数据集的结构)
insert into #t exec B
net_xiaojian 2011-09-19
  • 打赏
  • 举报
回复

详细介绍下:
存储过程 proc b
/*
里面有个全局临时表##b,该表主要在存储过程a里面作为临时被使用
*/

存储过程 proc a
/*
首先的执行存储过程b,所以有 exec proc b操作,这个操作后##b表肯定是有数据的,
存储过程a最后面有select ... 返回数据,但是最后面执行 exec proc a的时候返回的数据是2个数据集:
1、exec proc b
2、select ...

我只要第二条的数据集,不要1的。
*/

dawugui 2011-09-19
  • 打赏
  • 举报
回复
都放进临时表中去.
存储a插入A表.
存储b插入B表.
net_xiaojian 2011-09-19
  • 打赏
  • 举报
回复
net_xiaojian 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gogodiy 的回复:]
最简单的方法就是大乌龟的,存储过程B的结果集放入临时表B,然后存储过程A里对临时表进行处理后放入临时表A,最后只要读取临时表A即可。
[/Quote]

如果被调用的存储过程里面有很多
insert into ##tmp_saveFloatRainfallPlus(STCD,todayRain)
exec sp_executesql @strsql
set @strsql=''

那就会报 insert exec不能嵌套的异常。
gogodiy 2011-09-19
  • 打赏
  • 举报
回复
最简单的方法就是大乌龟的,存储过程B的结果集放入临时表B,然后存储过程A里对临时表进行处理后放入临时表A,最后只要读取临时表A即可。
net_xiaojian 2011-09-19
  • 打赏
  • 举报
回复
顶上去
-晴天 2011-09-19
  • 打赏
  • 举报
回复
我不知道你调用的存储过程是啥样的,但有可能你这个错误,就是因为调用全局临时表而产生的.
你可以试试:
在查询窗口输入
create table tb(id int,col varchar(10))
insert into tb select 1,'aa'
go
select * into ##t from tb
不关闭这个窗口,再打开一个窗口,执行
select * into ##t from tb
就会报错.
-晴天 2011-09-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 net_xiaojian 的回复:]
SQL code

--调用下列存储过程生成临时表##tmp_saveFloatRainfallPlus
--用于和临时表##tmp_saveFloatRainfallTime合并成一个表
exec dbo.[proc_getFloatRainfallPlus]

declare @strsql nvarchar(4000)
declare @……
[/Quote]
你这个最好不用全局临时表,否则一旦有并发,肯定会出错.
你的那两个全局临时表的结构都是固定的,在存储过程开始的时候,用 create table 构建一个局部临时表,然后在调用的时候用这样的语句:
insert into #t exec ...
如果那一开头的
exec dbo.[proc_getFloatRainfallPlus]
是用来生成全局临时表的话,同样,把这个过程中的全局临时表去掉,只用 select 返回记录集,然后用
insert into #t exec dbo.proc_......
来处理.

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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