先将整个代码放出来,接下来一步步说明。
create table #temTable(
FSerialNum int,
billNo varchar(200),
Flevel varchar(200),
beginDate datetime,
FNumber varchar(500),
FName varchar(500),
FModel varchar(1000),
FAttribute varchar(200),
FUnit varchar(200),
FDosage decimal(28,10),
FLoss decimal(28,10),
FNetWeight decimal(28,10)
)
insert into #temTable exec proc_gd_expandmultiorderbomBYSO 'HS19-2222'
select FSerialNum,billNo,Flevel,beginDate,FNumber,FName,FModel,FAttribute,FUnit,SUM(FDosage)as FDosage,FLoss,FNetWeight
from #temTable where customStatus=990240
group by FNumber,FSerialNum,billNo,Flevel,beginDate,FName,FModel,FAttribute,FUnit,FLoss,FNetWeight
drop table #temTable
步骤一:创建一个临时表
表的结构跟存储过程返回的结果集是相同的,类型什么的最好也一样。
create table #temTable(
FSerialNum int,
billNo varchar(200),
Flevel varchar(200),
beginDate datetime,
FNumber varchar(500),
FName varchar(500),
FModel varchar(1000),
FAttribute varchar(200),
FUnit varchar(200),
FDosage decimal(28,10),
FLoss decimal(28,10),
FNetWeight decimal(28,10)
)
步骤二:将结果集复制到临时表中
insert into #temTable exec proc_gd_expandmultiorderbomBYSO 'HS19-2222'
此处,我踩到了一个坑。刚开始 FModel 的类型我设为 varchar(100),结果报错:String or binary data would be truncated.
解决方法是 alter table #temTable alter column FModel varchar(1000) not null
不懂请看https://blog.csdn.net/Alone_in_/article/details/102933521
步骤四:对临时表进行操作
select FSerialNum,billNo,Flevel,beginDate,FNumber,FName,
FModel,FAttribute,FUnit,SUM(FDosage)as FDosage,FLoss,FNetWeight
from #temTable
where customStatus=990240
group by FNumber,FSerialNum,billNo,Flevel,beginDate,FName,FModel,FAttribute,FUnit,FLoss,FNetWeight
这里又掉一个坑:https://blog.csdn.net/Alone_in_/article/details/102933739
步骤五:就是将临时表删除啦!
drop table #temTable
始乱终弃不是我本意,为了节省空间嘛。
补充:
我在另一个地方再次用这种方法,发现报错了!
消息 8164,级别 16,状态 1,过程 MaterialSplit,第 65 行
An INSERT EXEC statement cannot be nested.
因为在存储过程里面返回的结果集,也是通过 insert exec 另一个存储过程 生成的,而sqlserver不允许这种嵌套。
解决方案:
https://blog.csdn.net/ocean42234111/article/details/52301298