SQL Server存储过程同时返回分页结果集和总数

 更新时间:2017年01月16日 15:50:09   作者:garfieldzf  
这篇文章主要为大家详细介绍了SQL Server存储过程同时返回分页结果集和总数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

      好长时间没摸数据库了,周末在家写了个报表的存储过程,一时间对使用存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现。按照我们正常的业务逻辑,存储过程数据首先是分页,其次接受若干查询条件,返回分页结果集的同时还需要返回记录总数给客户端。

      我对于这样一个业务存储过程总结如下: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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • sqlldr装载数据实现代码

    sqlldr装载数据实现代码

    本文将详细介绍如何用sqlldr装载数,需要了解更多的朋友可以参考下
    2012-12-12
  • SQL语句性能优化(续)

    SQL语句性能优化(续)

    这篇文章主要介绍了SQL语句性能优化(续),设计到性能优化相关知识,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-03-03
  • hive中将string数据转为bigint的操作

    hive中将string数据转为bigint的操作

    这篇文章主要介绍了hive中将string数据转为bigint的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • sql server数据库高可用日志传送的方法

    sql server数据库高可用日志传送的方法

    SQL Server 使用日志传送,您可以自动将“主服务器”实例上“主数据库”内的事务日志备份发送到单独“辅助服务器”实例上的一个或多个“辅助数据库”,下面这篇文章主要给大家介绍了关于sql server数据库高可用日志传送的相关资料,需要的朋友可以参考下
    2018-05-05
  • SQL查询语句求出用户的连续登陆天数

    SQL查询语句求出用户的连续登陆天数

    这篇文章主要是SQl语句的练习,本文教大家如何用SQL查询语句求出用户的连续登陆天数,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10
  • SQLServer数据库中开启CDC导致事务日志空间被占满的原因

    SQLServer数据库中开启CDC导致事务日志空间被占满的原因

    这篇文章主要介绍了SQLServer数据库中开启CDC导致事务日志空间被占满的原因分析和解决办法(REPLICATION),需要的朋友可以参考下
    2017-04-04
  • master数据库损坏的解决办法有哪些

    master数据库损坏的解决办法有哪些

    由于sqlserver 2008 master数据库损坏导致sqlserver服务启动失败,本文给大家master数据库损坏的解决办法,感兴趣的朋友一起参考下
    2015-10-10
  • 如何有效防止sql注入的方法

    如何有效防止sql注入的方法

    SQL注入攻击是黑客对数据库进行攻击常用的手段之一,本文主要介绍了如何如何有效防止sql注入,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • sql server排查死锁优化性能

    sql server排查死锁优化性能

    这篇文章介绍了sql server排查死锁优化性能的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • SQL文本提取/截取的四种方式

    SQL文本提取/截取的四种方式

    本文主要介绍了SQL文本提取/截取的四种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08

最新评论