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 语句或例程(如存储过程或函数)发送多行数据,这样 ...
随机推荐
- centos Ddos防范开源软件使用及apache ab压测 测试
1,检索特定字符的相同行,用于过滤点一些命令行的头说明
- python mysqlDB
1,Description MySQLdb is a Python DB API-2.0-compliant interface Supported versions: * MySQL version ...
- KMP算法java实现
/** * 假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置 如果j = -1,或者当前字符匹配成功(即S[i] == * P[j]),都令i++,j++,继续匹配下一个字符: 如果j != ...
- hdu 4686 Arc of Dream(矩阵快速幂乘法)
Problem Description An Arc of Dream is a curve defined by following function: where a0 = A0 ai = ai- ...
- eclipse sysout快捷输入启用
Window-Preference-java-editor-content assist-advanced 一定要勾选Template Propasals. 关于Template Propasals: ...
- MODULE_AUTHOR、MODULE_DESCRIPTION、MODULE_LICENSE宏
在阅读Linux Driver源码时,我们常常会在文件的结尾处看到诸如:MODULE_AUTHOR.MODULE_DESCRIPTION.MODULE_LICENSE等宏定义,这些宏主要是定义了一些模 ...
- git 在苹果系统中的一些命令
下面是在mac下使用git的一些命令的使用,如果想参看原文使用xcode来处理git,可以进入下面的链接,不过是英文的. 使用终端命令终端: cd /Users/Malek/desktop/GitUs ...
- OS Kernel Parameter.semopm
安装Oracle11g内核参数semopm未校验通过,点击Fix&Check Again后,会提示执行修改脚本,在/tmp/CVU_11.2.0.1.0_oracle下,找到并执行该脚本run ...
- MatLab实现FFT与功率谱
FFT和功率谱估计 用Fourier变换求取信号的功率谱---周期图法 clf; Fs=1000; N=256;Nfft=256;%数据的长度和FFT所用的数据长度 n=0:N-1;t=n/Fs;%采 ...
- 获得android应用的版本号
在开发的过程中,需要获得版本号 private PackageInfo getVersion() { PackageManager packageManager = MyApplication.get ...