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=‘[email protected]

	declare @strSQL nvarchar(max)

	set @strSQL=N‘select * from (select ROW_NUMBER() over(‘[email protected]+‘) as tmpid,* from( select * from (select ‘[email protected][email protected]+‘) as tmpTable1‘[email protected]+‘) 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 ‘[email protected][email protected]+‘) as tmpTable‘[email protected]

	print @strSQL
	exec sp_executesql @strSQL,N‘@total int out‘,@[email protected] out

end
GO

  

时间: 2025-01-03 00:33:53

SQL Server存储过程同时返回分页结果集和总数的相关文章

sql server存储过程分页,行变列

CREATE PROCEDURE [dbo].[PROC_GetPriviousAndNextDetailContent]@Index varchar(20),--表主键@Table varchar(100),--从哪个表获取数据@Columns varchar(100),--需要获取哪些字段@OrderStr varchar(100),--排序字段及方式@Where1    varchar(100),--row_number中的初步过滤条件@Where2 varchar(100)--当前要查询

Cpp 调用sql server 存储过程时不返回output参数解决办法

Cpp 调用sql server 存储过程时不返回output参数,但是在ssms中调用的时候能正常返回,貌似数据库和应用代码是一切正常,再测试用c#调用也能正常获取output参数,在存储过程的的开始加上set nocount on,就能解决这个问题. 墙外原文件:点击打开链接

SQL Server 存储过程(转载)

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

SQL Server 存储过程(转)

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行. 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数.输出参数.返回单个或多个结果集以及返回值. 由于存储

SQL Server存储过程的使用

存储过程概述 简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件,但是其作用不仅限于批处理. 基本概念: SQL Server中的存储过程是使用T_SQL编写的代码段.它的目的在于能够方便的从系统表中查询信息, 或者完成与更新数据库表相关的管理任务和其他的系统管理任务.T_SQL语句是SQL Server数据库与应用程序之间的编程接口. 存储过程就是SQL Server为了实现特定任务,而将一些需要多次调用的固定操作语句编写成程序段,这些程序段存储在服务器上, 有数据库服务器通

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正常的SQL语句,使用了Union(All)查询: SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --备注信息 , ai

SQL Server 存储过程具体解释

SQL Server 存储过程具体解释 存储过程的优缺点 ◆长处: 运行速度更快. 存储过程仅仅在创造时进行编译,而一般SQL语句每运行一次就编译一次,所以使用存储过程运行速度更快. 存储过程用于处理复杂的操作时,程序的可读性更强.网络的负担更小. 使用存储过程封装事务性能更佳. 能有效的放注入,安全性更好. 可维护性高.在一些业务规则发生变化时.有时仅仅需调整存储过程就可以.而不用修改和重编辑程序. 更好的代码重用. ◆ 缺点: 存储过程将给server带来额外的压力. 存储过程多多时维护比較

14、SQL Server 存储过程

SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或多个结果集. 存储过程带来的好处: 1.性能的提升 存储过程执行时,第一次会进行编译和优化.但批处理T-SQL语句每次执行都需要预编译和优化,所以没有存储过程快. 2.易于维护 存储过程创建后存储在数据库中,可以被程序多次调用执行.当需要修改存储过程时,对应用程序代码毫无影响. 3.安全性 应用程序

sql server 存储过程 拼接SQL 超过8000

问题描述: 公司需要做一个报表,根据人员组织树,点击某一节点的时候,显示下一个直接子节点的表单申请情况,根据表单状态进行分组. 实现思路: 一开始是想通过拼接SELECT SQL,将所有子节点的报表情况union,然后所谓存储过程的结果返回.调试过程中发现,拼接出来的SQL太长,在拼接过程中自动被截断了. 解决思路: 分别执行原本打算拼接的SELECT 语句,将每个结果一次插入一个临时表,最后将所有临时表的数据作为存储过程的结果返回. sql server 存储过程 拼接SQL 超过8000