MSSQL MySQL 数据库分页(存储过程)

复制代码 代码如下:declare @strCountTmp
varchar(100State of Qatar –记录数换成: 复制代码
代码如下:declare @strCountTmp nvarchar(100卡塔尔 –记录数

复制代码 代码如下:/* 日期:二〇一〇-03-19
成效:依照各个条件获得 游戏国家义务 列表数据 */ Create procedure
[dbo].[PrGs_Nation_Task_GetList] @PageSize int = 100, —
每页展现记录条数,默感到100 @PageIndex int = 1, —
当前领取要出示的页码,默感到1,数据库依据PageSize,PageIndex
计算再次回到一页数据 @RetTotal int output, — 记录总量 @RetCount int output,
— 重回记录数 @RetPageIndex int output, — 输出当前页码 @ReturnDesc
varchar(128卡塔尔国 output — 重临操作结果描述 as begin set nocount on set
xact_abort on set @RetTotal = 0 set @RetCount = 0 set @RetPageIndex =
@PageIndex — 多规格取值 declare @Err int — 错误 declare @PageCount int
— 总页数 declare @Begin科雷傲ID int — 最初行 Rid declare @MaxRow int —
最终行 select @RetTotal = count(*卡塔尔国 from NationTask select @Err =
@@E本田CR-VRO奥迪Q5 if @Err 0 begin set @ReturnDesc = ‘提取国家义务总的数量战败!’
return -1 end — 如若过多据, 则重临空结果集 if @RetTotal = 0 begin set
@ReturnDesc = ‘当前口径无国家职责记录!’ return 1 end — 总结总页数 set
@PageCount = @RetTotal / @PageSize if @RetTotal % @PageSize 0 begin set
@PageCount = @PageCount + 1 end — 跨越总页数,则赶回空结果集 if
@PageIndex @PageCount begin set @ReturnDesc = ‘当前口径无国家职责记录!’
return 1 end — 获取 要重回页面包车型客车 第一行业纪律录的 Rid set @马克斯Row =
@PageSize * (@PageIndex – 1卡塔尔 + 1 set rowcount @MaxRow select @Begin福睿斯ID
= Rid from NationTask order by Rid desc — 再次来到数据列表 set rowcount
@PageSize select Rid ,TaskName ,TaskTitle ,ImageID ,EffectID ,StartTime
from NationTask where Rid = @BeginMuranoID order by Rid desc set @RetCount =
@@rowcount — 甘休 set @ReturnDesc = ‘提取国家职责列表成功!’ return 1
end

先看看单条 SQL 语句的分页 SQL 吧。 方法1: 适用于 SQL Server 2004/2006复制代码 代码如下: SELECT TOP 页大小 *
FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1卡塔尔 id FROM table1
O奥迪Q5DE揽胜极光 BY id State of Qatar OCRUISERDE讴歌ZDX BY id 方法2: 适用于 SQL Server 二零零二/二〇〇五 复制代码 代码如下: SELECT TOP 页大小 * FROM
table1 WHERE id ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP
页大小*(页数-1卡塔尔国 id FROM table1 O奥迪Q5DEWrangler BY id 卡塔尔(قطر‎ A 卡塔尔 ORAV4DEQX56 BY id 方法3:
适用于 SQL Server 2006 复制代码 代码如下:
SELECT TOP 页大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS
RowNumber,* FROM table1 ) A WHERE RowNumber 页大小*(页数-1State of Qatar 方法4:
适用于 SQL Server 2007 复制代码 代码如下:
row_number(卡塔尔(قطر‎ 必得拟订 order by
,不内定能够如下跌成,但无法保证分页结果正确,因为排序不自然可相信。概率先次询问记录A在第一页,第二遍查询又跑到了第二页。
declare @PageNo int ,@pageSize int; set @PageNo = 2 set @pageSize=20
select * from ( select row_number() over(order by getdate()) rn,*
from sys.objects) tb where rn (@PageNo-1)*@pageSize and rn
=@PageNo*@pageSize 还或许有一种办法正是将排序字段作为变量,通过动态SQL
完成,能够改成存储进程。 复制代码
代码如下: declare @PageNo int ,@pageSize int; declare @TableName
varchar(128卡塔尔国,@OrderColumns varchar(500卡塔尔, @SQL varchar(max卡塔尔; set @PageNo
= 2 set @pageSize=20 set @TableName = ‘sys.objects’ set @OrderColumns =
‘name ASC,object_id DESC’ set @SQL = ‘select * from ( select
row_number() over(order by ‘+@OrderColumns+’ ) rn,* from ‘
+@TableName+’)tb where rn ‘+convert(varchar(50),(@PageNo-1)*@pageSize)
+’ and rn = ‘+convert(varchar(50),@PageNo*@pageSize卡塔尔(قطر‎ print @SQL
exec(@SQL卡塔尔国 方法5:(利用SQL的游标存款和储蓄进度分页卡塔尔国 适用于 SQL Server 二零零六复制代码 代码如下: create procedure
SqlPager @sqlstr nvarchar(4000State of Qatar, –查询字符串 @currentpage int, –第N页
@pagesize int –每页行数 as set nocount on declare @P1 int,
–P1是游标的id @rowcount int exec sp_cursoropen @P1
output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output select
ceiling(1.0*@rowcount/@pagesize) as 总页数–,@rowcount as
总行数,@currentpage as 当前页 set
@currentpage=(@currentpage-1)*@pagesize+1 exec sp_cursorfetch
@P1,16,@currentpage,@pagesize exec sp_cursorclose @P1 set nocount off
方法5:(利用MySQL的limitState of Qatar 适用于 MySQL
mysql中limit的用法安详严整[数据分页常用]
在大家采用查询语句的时候,常常要回来前几条大概中间某几行数据,此时咋做吧?不用操心,mysql已经为大家提供了如此贰个效应。
复制代码 代码如下: select * from table
limit [offset,] rows | rows offset offset limit 子句能够被用来强制select 语句再次来到钦点的记录数。limit
采纳一个或七个数字参数。参数务必是多个卡尺头常量。假诺给定多个参数,第叁个参数内定第二个再次回到记录行的偏移量,第1个参数钦赐重临记录行的最大数额。初阶记录行的偏移量是 0(实际不是 1卡塔尔(قطر‎: 为了与 postgresql 包容,mysql
也帮忙句法: limit # offset #。 mysql select * from table limit 5,10;
// 检索记录行 6-15
//为了检索从某一个偏移量到记录集的收尾全数的记录行,能够内定第四个参数为
-1: mysql select * from table limit 95,-1; // 检索记录行 96-last.
//如若只给定八个参数,它意味着回去最大的记录行数目: mysql select * from
table limit 5; //检索前 5 个记录行 //换句话说,limit n 等价于 limit
0,n。 1. select * from tablename 条件语句 limit 100,15
从100条记下后初步取15条 (实际取取的是第101-115条数据卡塔尔(قطر‎ 2. select * from
tablename 条件语句 limit 100,-1 从第100条后伊始-最终一条的记录 3. select
* from tablename 条件语句 limit 15 也就是limit 0,15
.查询结果取前15条数故事明,页大小:每页的行数;页数:第几页。使用时,请把”页大小”和”页大小*(页数-1卡塔尔(قطر‎”替换来数字。
此外的方案:若无主键,能够用临时表,也得以用方案三做,可是功用会低。
提议优化的时候,加上主键和目录,查询功用会加强。 通过SQL
查询分析器,展现相比较:小编的定论是: 分页方案二:(利用ID大于多少和SELECT
TOP分页)效能最高,供给拼接SQL语句 分页方案一:(利用Not In和SELECT
TOP分页卡塔尔 作用次之,供给拼接SQL语句
分页方案三:(利用SQL的游标存款和储蓄进度分页卡塔尔(قطر‎ 作用最差,可是最佳通用