我的通用分页
(by dragonimp)
考虑了好久,一直想不好用什么方案好。
综合了各种方法写了自己的分页,准备在其他过程中调用。
CREATE PROCEDURE SelectPagedSQL
(
@SQL nvarchar(512),
@IndexField nvarchar(100),
@PageSize int=10,
@PageIndex int=1,
@Sort nvarchar(128)=@IndexField,
@TotalCount int=0 output
)
AS
declare @strSQL nvarchar(1024)
set @strSQL='SELECT * FROM
(SELECT TOP '+str(@PageSize)+' * FROM
(SELECT TOP '+str(@PageSize*@PageIndex)+' * FROM
('+@SQL+') AS t0
ORDER BY '+@IndexField+' ASC) AS t1
ORDER BY '+@IndexField+' DESC) AS t2
ORDER BY ' +@Sort
+'
set nocount on
select @TotalCount=count(*) from ('+@SQL+') as t0'
exec sp_executesql
@strSQL,
N'@TotalCount int=0 OUTPUT',
@TotalCount=@TotalCount OUTPUT
GO
经过测试,发现一个问题
在写这个的时候,一直拿不准要用id>max(id)还是直接top n,不知道哪种更快。
现在发现直接top是不行的,因为这样如果要的页面超出了表的范围,这样还是会得到记录的。也就是说这个是不可能出现没有记录的情况。所以,还是要改为max的方法。
别人有写了一个max的,但是他的输入参数不好,要指定tablename,我这个可以指定sql。速度上我这个慢了一点点,等我改用max看看是不是因为top的原因。