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 语句或例程(如存储过程或函数)发送多行数据,这样 ...
随机推荐
- Ruiy classicsQuotations
1,IT界,许多人会称自己为菜鸟,而每只菜鸟都会有鹰的梦想; 2,把做十件事精力用来做一件事情,你事业就经典了;
- subllime text 创建可复用的代码片段
对于前端工程师来讲,写一个html页面的基本结构是体力活,每次去拷贝一个也麻烦,sublime text 2 提供了一个很好的复用代码片段.下面介绍一下创建一个html5的代码片段的过程. 在菜单上点 ...
- TransactionScope使用说明 【转】
TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间.它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物.使用之前必须添 ...
- iOS开发-使用Storyboard进行界面跳转及传值
前言:苹果官方是推荐我们将所有的UI都使用Storyboard去搭建,Storyboard也是一个很成熟的工具了.使用Storyboard 去搭建所有界面,我们可以很迅捷地搭建出复杂的界面,也就是说能 ...
- win7充分利用cpu来提供计算机性能
在任务栏左下角点击开始菜单,在运行框内输入msconfig,在弹出的窗口点击“高级选项”,接着会弹出一个新窗口,我们勾选“处理器数”,在下拉菜单中按照自己的电脑配置进行选择,现在双核比较常见,当然也有 ...
- jQuery ZeroClipboard中Flash定位不准确的解决方案
转自波斯马,原文地址<jQuery ZeroClipboard中Flash定位不准确的解决方案> jQuery ZeroClipboard支持在多种浏览器中复制内容到剪贴板,IE.Fire ...
- 使用XmlReader读Xml
XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO):而在有些场景下我们必须考虑尽可能节省内存和I ...
- javascript 数据结构和算法读书笔记 > 第四章 栈
1. 对栈的操作 栈是一种特殊的列表,栈中的元素只能通过列表的一端进行访问,即栈顶.类似于累起一摞的盘子,只能最后被放在上面的,最先能被访问到. 就是我们所说的后入先出(LIFO). 对栈主要有入栈p ...
- Python : 熟悉又陌生的字符编码(转自Python 开发者)
Python : 熟悉又陌生的字符编码 字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概 ...
- 如何在IIS 中配置应用程序(Convert to Application)?
1.打开IIS 2.选择待操作的虚拟目录 3.鼠标右键,点击"Convert to Application” 4.点击connect as 5.选中Specific user,并点击Set ...