最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
SQL Server存储过程同时返回分页结果集和总数
时间:2022-06-29 07:46:51 编辑:袖梨 来源:一聚教程网
前言
好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现。按照我们正常的业务逻辑,存储过程数据首先是分页,其次接受若干查询条件,返回分页结果集的同时还需要返回记录总数给客户端。
我对于这样一个业务存储过程总结如下:1、内核层,通常也就是要查询的字段或者要计算的字段,这部分单独拿出来。 2、查询条件层。 如果内核只是查询一些字段的话,条件可以放在查询条件层拼接。 如果内核层完全是统计业务逻辑,那么查询条件则必须要放在内核层,像我们常用的SUM、GROUPBY 业务。 3、添加分页参数(也就是我们现在多数用的ROW_NUMBER添加rn参数)。 存储过程里我们一般会单独声明每个部分的变量用于执行时拼接。
存储过程
CREATEproc [dbo].[usp_manyidu]
(
@seatno nvarchar(30),
@pageIndexint,
@pageSizeint,
@rsCountintout
)
as
begin
declare@sql nvarchar(max) --拼接内核SQL
declare@wherenvarchar(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
execsp_executesql @strSQL,N'@total int out',@total=@rsCountout
end
GO
相关文章
- 羞羞漫画最新登录网址-羞羞漫画永久免费登录网站 03-05
- 学习通网页版登录入口-学习通官网网址一键登录 03-05
- 歪歪漫画网站下载安装最新版本-云缨巡街漫画免费下载高清版 03-05
- 羞羞漫画2026下载-羞羞漫画2026最新版v3.2.6下载 03-05
- picacg哔咔加速神器-picacg官网最新版 03-05
- 微信文件传输助手网页版地址-文件传输助手网页版链接获取 03-05