SQL Server存储过程同时返回分页结果集和总数
前言
好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现。按照我们正常的业务逻辑,存储过程数据首先是分页,其次接受若干查询条件,返回分页结果集的同时还需要返回记录总数给客户端。
我对于这样一个业务存储过程总结如下:1、内核层,通常也就是要查询的字段或者要计算的字段,这部分单独拿出来。 2、查询条件层。如果内核只是查询一些字段的话,条件可以放在查询条件层拼接。如果内核层完全是统计业务逻辑,那么查询条件则必须要放在内核层,像我们常用的SUM、GROUPBY业务。3、添加分页参数(也就是我们现在多数用的ROW_NUMBER添加rn参数)。 存储过程里我们一般会单独声明每个部分的变量用于执行时拼接。
存储过程
CREATEproc[dbo].[usp_manyidu]
(
@seatnonvarchar(30),
@pageIndexint,
@pageSizeint,
@rsCountintout
)
as
begin
declare@sqlnvarchar(max)--拼接内核SQL
declare@wherenvarchar(max)='where1=1'--查询条件拼接字符串
declare@colsnvarchar(max)--查询字段、计算字段
declare@sortnvarchar(50)--排序
set@sql='fromdbo.logwhereseatnoisnotnullandseatno<>''''groupbyseatno'
set@cols='seatno,SUM(casewhenmanyidu=0then1else0end)asmanyi,
SUM(casewhenmanyidu=1then1else0end)asyiban,
SUM(casewhenmanyidu=2then1else0end)asbumanyi,
SUM(casewhenmanyiduISnullormanyidu=''''then1else0end)asweipingjia'
set@sort='orderbyseatno'
if(@seatno<>'')
set@where+='andseatno='+@seatno
declare@strSQLnvarchar(max)
set@strSQL=N'select*from(selectROW_NUMBER()over('+@sort+')astmpid,*from(select*from(select'+@cols+@sql+')astmpTable1'+@where+')astmpTable2)astmpTable3'
+'wheretmpidbetween'+STR((@pageIndex-1)*@pageSize+1)+'and'+STR(@pageIndex*@pageSize)
print@strSQL
exec(@strSQL)
set@strSQL='select@total=count(*)from(select'+@cols+@sql+')astmpTable'+@where
print@strSQL
execsp_executesql@strSQL,N'@totalintout',@total=@rsCountout
end
GO
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。