+ 'select top ' + STR(@pageSize*@pageIndex) + ' '+ @tbFields + ' FROM '
+ @tbName + @whereStr + @orderStr + ') as a '
+ @orderStr2 + ') as b ' + @orderStr
end
print @sql
EXEC SP_EXECUTESQL @sql
--测试
declare @a BIGINT,@b BIGINT
exec sp_pagination 'orders ', '* ', ' ', 'orderid asc ',1,5,10,@a output,@b output
print @a
print @b
------------------------------------------------------------------------------------------------------
第二种方案:基于not in ,原型如下
select top 页大小 *
from testtable
where (
id not in
(select top 页大小*页数 id from 表 order by id)
)
order by id
弊病:1 强制排序
2 排序列必须是唯一列,否则分页情况不符实际
3. 使用not in,速度慢,
第三种方案: 基于max 或者 min ,原型如下:
select top 页大小 *
from testtable
where (
id > (
select max(id ) from ( select top 页大小*页数 id from 表
order by id ) as t
)
)
order by id
弊病:1 强制排序
2 排序列必须是唯一列,否则分页情况不符实际
最后总结:
sqlserver 分页就是烂,第二第三种方案基本上是淘汰掉了
,因为现在基本上什么表都是根据添加时间来排序,所以那两种方案
没有用,真亏作者也敢发布出来,
只有第一种方案还是稍微能用一下,但还是要复杂的拼sql 语句,不方便,要通用于所有表有点难度,
象oracle 就很方便了,基于rownum,传入一个sql 查询语句,这个查询语句爱怎么写就怎么写,反正保证它得到一个结果集就行,不像sqlserver又是要求唯一健又是要求必须排序,把一个结果集颠来倒去,不慢才怪呢,