SQLserver 中如何操作存储过程的结果集

Tobin_han 2016-12-24 04:15:07
--有一个存储过程 SalaryTable 叫工资表,这个表是同事提供的,里面的列是动态查询并计算出来的,我不能修改只能调用。

create proc SalaryTable
,@iMonth NVARCHAR(20) --月份
,@iYear NVARCHAR(20) --年份
,@cClassCode NVARCHAR(50)--类型编码
,@cClassName NVARCHAR(255)--类型名称

as
SET NOCOUNT ON
BEGIN

--这里是具体的业务逻辑,其中的具体逻辑如何计算不需要关心,只需要使用这个存储过程的结果集就行了。

END

go


--执行该存储过程(根据输入的月份不同可以查询不同月份的工资明细)


--查询2016年5月份的工资明细 执行结果
exec SalaryTable '5','2016','001','工资'
年 月 员工编码 员工名称 基本工资 奖金 提成 出差费 加班费 公积金 社会保险 业务报销 交通补贴 住房补贴 饭贴

2016 5 ST001 张三 4000 1000 1000 500 200 200 100 1500 200 500 300
2016 5 ST002 李四 5000 1000 1000 500 200 200 100 1500 200 500 300
2016 5 ST003 王五 6000 1000 1000 500 200 200 100 1500 200 500 300

--查询2016年6月份的工资明细 执行结果
exec SalaryTable '6','2016','001','工资'
年 月 员工编码 员工名称 基本工资 奖金 提成 出差费 加班费 公积金 社会保险 业务报销 交通补贴 住房补贴 饭贴

2016 6 ST001 张三 4000 1000 1000 200 100 200 100 100 200 500 300
2016 6 ST002 李四 5000 1000 1000 300 100 200 100 100 200 500 300
2016 6 ST003 王五 6000 1000 1000 400 100 200 100 100 200 500 300


--下面需求来了
--1,该功能为财务总监看的一个报表功能。
--2,当财务总监输入年份时统计某个员工一年的工资明细。

--最终实现结果


年 月 员工人数 员工编码 员工名称 基本工资(基本工资+奖金+提成+补贴) 出差费 公积金 社会保险 业务报销
2016 4 0
2016 5 3 ST001 张三 7000 500 200 100 1500
2016 5 3 ST002 李四 8000 500 200 100 1500
2016 5 3 ST003 王五 9000 500 300 100 1500
2016 6 3 ST001 张三 7200 200 200 100 100
2016 6 3 ST002 李四 8200 300 200 100 100
2016 6 3 ST003 王五 9200 400 200 100 100
2016 7 0
2016 8 0
2016 9 0
2016 10 0
2016 11 0
2016 12 0
2017 1 0
2017 2 0
2017 3 0


--这样解释不知道能否容易理解,还请大神指点。
--这个功能并没有那么复杂,主要有两个功能点无法攻克,还请大神指点。
--1.当财务总监输入年份时循环调用SalaryTable存储过程(为什么循环呢,比如:输入2016,在SalaryTable存储过程中查询2016年4月至12月与2017年1月至3月数据)不知道为什么客户过年是这样的。所以需要根据年份判断不同年份与月份
--2.将每次调用存储过程的结果集插入到临时表,之后操作临时表。(为什么要插入临时表呢,因为我不知道如何合并存储过程执行的结果集)


--还望大神门多多指点,是否能有更好的解决方案,非常感谢。

...全文
1094 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2016-12-26
  • 打赏
  • 举报
回复
引用 4 楼 Tobin_han 的回复:
引用 3 楼 ch21st 的回复:
最普通的做法,先定义一个和结果相同结果的临时表,然后循环执行存储过程,将结果插入这个表
可是存储过程执行的结果是动态的,列是不固定的。
我看你的列子存储过程返回的是相同的结果 只不过所有存储过程返回数据合并好后,要处理下SQL 是按你的要求是每次返回的结果要进一步加工,比如:


 SELECT 年,月,COUNT(员工编码)OVER(PARTITION BY  年,月) AS 员工人数,员工编码,员工名称
       ,基本工资+奖金+提成+饭贴 AS  [基本工资(基本工资+奖金+提成+补贴)],出差费,公积金,社会保险,业务报销  
 FROM #AllData
juno_393 2016-12-26
  • 打赏
  • 举报
回复
在过程中定义一个临时表,每次循环得到的结果集插入这边临时表就OK
Tobin_han 2016-12-26
  • 打赏
  • 举报
回复
引用 2 楼 shoppo0505 的回复:
可以使用: insert into @table exec sp_... 或者直接在SSRS中调用你同事提供的sp,layout使用SSRS完成
@table 如何声明呢? declare @table 类型是什么呢?
Tobin_han 2016-12-26
  • 打赏
  • 举报
回复
引用 3 楼 ch21st 的回复:
最普通的做法,先定义一个和结果相同结果的临时表,然后循环执行存储过程,将结果插入这个表
可是存储过程执行的结果是动态的,列是不固定的。
道素 2016-12-26
  • 打赏
  • 举报
回复
最普通的做法,先定义一个和结果相同结果的临时表,然后循环执行存储过程,将结果插入这个表
shoppo0505 2016-12-26
  • 打赏
  • 举报
回复
可以使用: insert into @table exec sp_... 或者直接在SSRS中调用你同事提供的sp,layout使用SSRS完成
卖水果的net 2016-12-24
  • 打赏
  • 举报
回复
你们的工资表,是不是分成了很多表? 各个表的列也不一样?

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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