我的通用分页存储过程

来源:互联网 发布:手机屏幕挂字软件 编辑:程序博客网 时间:2024/06/04 20:03

我的通用分页

 (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的原因。

原创粉丝点击