sql server存储过程分页
Create PROCEDURE [dbo].[Table_GetList]
@WhereStr nvarchar(256) = '', -- 查询条件(注意: 不要加 WHERE)
@OrderStr nvarchar(128) = '', -- 设置排序
@PageIndex int = 1, -- 页尺寸
@PageSize int = 0 , -- 页码
@RecordCount int output -- 总的记录数
AS DECLARE @TableName nvarchar(32) -- 表名
DECLARE @PriKeyName nvarchar(32) -- 主键列或标示列
DECLARE @FldNames nvarchar(512) -- 字段名,多个字段通过逗号分割 DECLARE @StrByPage nvarchar(1024) -- 分页查询语句
DECLARE @StrNoPage nvarchar(512) -- 不分页查询语句,获得所有符合条件的记录
DECLARE @StrTotal nvarchar(512) -- 统计符合条件的纪录数
DECLARE @StrNonResult nvarchar(512) -- 返回空记录的语句
DECLARE @StrTmp nvarchar(128)
DECLARE @StrOrder nvarchar(128)
DECLARE @TotalPage int SET @TableName = 'ProductActions as b'
SET @PriKeyName = 'ActionID'
SET @FldNames = 'b.*'
SET @TotalPage = 0 --不传值默认主键降序
IF @OrderStr is null or @OrderStr=''
SET @OrderStr = '' IF @OrderStr = '' -- 升序
BEGIN
SET @StrTmp = @PriKeyName + '>(SELECT max([' + @PriKeyName + ']) FROM '
SET @StrOrder = ' order by ' + @PriKeyName + ' asc'
END
ELSE IF @OrderStr = '' -- 降序
BEGIN
SET @StrTmp = @PriKeyName + '<(SELECT min([' + @PriKeyName + ']) FROM '
SET @StrOrder = ' order by ' + @PriKeyName + ' desc'
END
ELSE -- 用户自定义排序规则
BEGIN
SET @StrTmp = ''
SET @StrOrder = ' order by ' + @OrderStr
END
SET @StrNonResult = 'SELECT ' + @FldNames + ' FROM ' + @TableName + ' WHERE 1=2'
IF @WhereStr is null or @WhereStr = '' -- 如果没有额外的查询条件
BEGIN
SET @StrTotal = N'SELECT @RecordCount = count(1) FROM ' + @TableName
SET @StrNoPage = N'SELECT ' + @FldNames + ' FROM ' + @TableName + @StrOrder
END
ELSE
BEGIN
SET @StrTotal = N'SELECT @RecordCount = count(1) FROM ' + @TableName + ' WHERE ' + @WhereStr
SET @StrNoPage = N'SELECT ' + @FldNames + ' FROM ' + @TableName + ' WHERE ' + @WhereStr + @StrOrder
END -- 取得所有符合查询条件的记录数
EXEC sp_EXECuteSql @StrTotal,N'@RecordCount int output',@RecordCount output
-- 如果没有适合条件的记录时,提供一个空的记录集并退出查询
IF @RecordCount = 0
BEGIN
SET @TotalPage = 0
EXEC sp_EXECuteSql @StrNonResult
RETURN 0
END
-- 执行查询,此时记录集不为空
IF @PageSize = 0 -- 当不需要分页时
BEGIN
SET NOCOUNT ON
SET @TotalPage = 0
EXEC sp_EXECuteSql @StrNoPage
RETURN
END
ELSE -- 当需要分页时
BEGIN
SET NOCOUNT ON
-- 得到记录的页数,并调整页号,分页从1开始
SET @TotalPage=CEILING(cast(@RecordCount as float)/@PageSize)
IF(@PageIndex>@TotalPage)
SET @PageIndex=@TotalPage
IF(@PageIndex <1)
SET @PageIndex=1
IF @PageIndex =1 -- 如果是第一页
BEGIN
IF @WhereStr=''
SET @StrByPage = N'SELECT TOP ' + cast(@PageSize as varchar) + ' ' + @FldNames + ' FROM ' + @TableName + @StrOrder
ELSE
SET @StrByPage = N'SELECT TOP ' + cast(@PageSize as varchar) + ' ' + @FldNames + ' FROM ' + @TableName + ' WHERE ' + @WhereStr + @StrOrder
END
ELSE -- 以后页
BEGIN IF (@OrderStr='' or @OrderStr='') -- 按主键升序或降序
BEGIN
IF @WhereStr=''
SET @StrByPage = N'SELECT TOP ' + cast(@PageSize as varchar) + ' ' + @FldNames
+ ' FROM ' + @TableName
+ ' WHERE ' + @StrTmp
+ ' (SELECT TOP ' + cast((@PageIndex-1) * @PageSize as varchar) + ' ' + @PriKeyName
+ ' FROM ' + @TableName + @StrOrder + ') as tmptbl)'
+ @StrOrder
ELSE
SET @StrByPage = N'SELECT TOP ' + cast(@PageSize as varchar) + ' ' + @FldNames
+ ' FROM ' + @TableName
+ ' WHERE ' + @StrTmp
+ ' (SELECT TOP '+ cast((@PageIndex-1) * @PageSize as varchar) + ' ' + @PriKeyName
+ ' FROM ' + @TableName + ' WHERE ' + @WhereStr + @StrOrder + ') as tmptbl)'
+ ' and ' + @WhereStr
+ @StrOrder
END
ELSE -- 没有排序规则或者用户自定义规则
BEGIN
IF @WhereStr=''
SET @StrByPage = N'WITH cte AS('
+ ' SELECT ROW_NUMBER() OVER('+@StrOrder+') AS ROWNUMBER ,' + @FldNames
+ ' FROM '+ @TableName
+ ') SELECT * FROM cte WHERE ROWNUMBER BETWEEN '
+ CAST(((@PageIndex -1) * @PageSize +1) AS varchar) + ' AND '
+ CAST(@PageIndex * @PageSize AS varchar)
ELSE
SET @StrByPage = N'WITH cte AS('
+ ' SELECT ROW_NUMBER() OVER('+@StrOrder+') AS ROWNUMBER ,' + @FldNames
+ ' FROM '+ @TableName + ' WHERE ' + @WhereStr
+') SELECT * FROM cte WHERE ROWNUMBER BETWEEN '
+ CAST(((@PageIndex -1) * @PageSize +1) AS varchar) + ' AND '
+ CAST(@PageIndex * @PageSize AS varchar)
END
END END --PRINT @StrByPage
EXEC sp_executeSql @StrByPage
RETURN
sql server存储过程分页的更多相关文章
- SQL Server 存储过程分页
每每面试,总会有公司问到分页.在下不才,在这里写几种分页,望路过的各位大神尽情拍砖. 先从创建数据库说起.源码如下 一.创建数据库 /********************************* ...
- SQL Server 存储过程 分页查询
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...
- sql server存储过程分页,行变列
CREATE PROCEDURE [dbo].[PROC_GetPriviousAndNextDetailContent]@Index varchar(20),--表主键@Table varchar( ...
- SQL Server 存储过程分页。
create proc proc_Product@page int, -- 页数@row int -- 一页有几行Asdeclare @newpage int set @newpage = (@ ...
- 浅谈SQL Server数据库分页
数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多 ...
- SQL Server 存储过程(转载)
SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...
- (摘录)SQL Server 存储过程
文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- SQL Server存储过程中使用表值作为输入参数示例
这篇文章主要介绍了SQL Server存储过程中使用表值作为输入参数示例,使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据,这样 ...
随机推荐
- eclipse 中的凝视 快捷键
(1)Ctrl+Space 说明:内容助理. 提供对方法,变量,參数,javadoc等得提示, 应运在多种场合,总之须要提示的时候可先按此快捷键. 注:避免输入法的切换设置与此设置冲突 (2)Ctrl ...
- Spring Http Invoker
配置例如以下: ①web.xml配置 <servlet> <servlet-name>remote</servlet-name> <servlet-class ...
- Silverlight学习(三)
最近对WCFRIA+MVVM+Prism有了初步的认识,能够简单的实现一些数据库的交互.这节主要讲的是Silverlight通过domainservice和ado.net实体数据模型与数据库的交互.本 ...
- C# 根据年月获得此月第一天和最后一天,并计算工作日
string str = "2015年3月"; ); ); , secondIndex - firstIndex - ); , ); DateTime dt = DateTime. ...
- 必须知道的ADO.NET 数据库连接池
http://www.cnblogs.com/liuhaorain/archive/2012/02/19/2353110.html 题外话 通过前几章的学习,不知道大家对ADO.NET有一定的了解了没 ...
- Oracle视图基础
--表的另一种形式,看起来很像表 --用view可以实现复杂的query====select --创建一个视图 --当经常使用这个查询时封装成view /*create or replace 表示在创 ...
- Python基础之 urllib模块urlopen()与urlretrieve()的使用方法详解。
Python urllib模块urlopen()与urlretrieve()的使用方法详解 1.urlopen()方法urllib.urlopen(url[, data[, proxies]]) ...
- ApiGen4.1 windows安装教程
一. ApiGen4.1版本介绍 1.ApiGen介绍 ApiGen是自动生成PHP项目的阅读文档工具. 用于从PHP源代码创建专业的API文档,类似于phpDocumentor/phpDoc. Ap ...
- oc block基本使用
// // main.m // block基本使用 // // Created by Ymmmsick on 15/7/21. // Copyright (c) 2015年 Ymmmsick. All ...
- 如何在同一系统里同时启动多个Tomcat
需要在同一系统里启动多个tomcat,应该怎么处理? tomcat是个服务程序,需要占用几个通讯端口,所以默认情况是不能启动多个tomcat,如果要启动多个tomcat,需要修改配置文件,通过在配置文 ...