设为首页 收藏本站
查看: 1098|回复: 0

[经验分享] SQL Server存储过程同时返回分页结果集和总数

[复制链接]

尚未签到

发表于 2017-7-13 12:49:59 | 显示全部楼层 |阅读模式
前言
  好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现。按照我们正常的业务逻辑,存储过程数据首先是分页,其次接受若干查询条件,返回分页结果集的同时还需要返回记录总数给客户端。
  我对于这样一个业务存储过程总结如下:1、内核层,通常也就是要查询的字段或者要计算的字段,这部分单独拿出来。  2、查询条件层。 如果内核只是查询一些字段的话,条件可以放在查询条件层拼接。 如果内核层完全是统计业务逻辑,那么查询条件则必须要放在内核层,像我们常用的SUM、GROUPBY 业务。 3、添加分页参数(也就是我们现在多数用的ROW_NUMBER添加rn参数)。   存储过程里我们一般会单独声明每个部分的变量用于执行时拼接。

存储过程



CREATE proc [dbo].[usp_manyidu]
(
@seatno nvarchar(30),
@pageIndex int,
@pageSize int,
@rsCount int out
)
as
begin
declare @sql nvarchar(max)       --拼接内核SQL
declare @where nvarchar(max)=' where 1=1' --查询条件拼接字符串
declare @cols nvarchar(max)     --查询字段、计算字段
declare @sort nvarchar(50)      --排序
set @sql=' from dbo.log where seatno is not null and seatno<>'''' group by seatno '
set @cols='seatno,SUM(case when manyidu=0 then 1 else 0 end) as manyi,
SUM(case when manyidu=1 then 1 else 0 end) as yiban,
SUM(case when manyidu=2 then 1 else 0 end) as bumanyi,
SUM(case when manyidu IS null or manyidu='''' then 1 else 0 end) as weipingjia'
set @sort='order by seatno'
if(@seatno <>'')
set @where+=' and seatno='+@seatno

declare @strSQL nvarchar(max)
set @strSQL=N'select * from (select ROW_NUMBER() over('+@sort+') as tmpid,* from( select * from (select '+@cols+@sql+') as tmpTable1'+@where+') as tmpTable2) as tmpTable3'
+' where tmpid between '+STR((@pageIndex-1)*@pageSize+1)+' and '+STR(@pageIndex*@pageSize)
print @strSQL
exec(@strSQL)
set @strSQL='select @total=count(*) from (select '+@cols+@sql+') as tmpTable'+@where
print @strSQL
exec sp_executesql @strSQL,N'@total int out',@total=@rsCount out

end
GO

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393421-1-1.html 上篇帖子: SQL Server中参数化SQL写法遇到parameter sniff ,导致不合理执行计划重用的一种解决方案 下篇帖子: 理解SQL Server是如何执行查询的 (3/3)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表