用SQL 2005的ROW_NUMBER() 实现分页功能

浏览:27日期:2023-06-26

DECLARE @pagenum AS INT, @pagesize AS INTSET @pagenum = 2SET @pagesize = 3SELECT *FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum, newsid, topic, ntime, hits FROM news) AS DWHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesizeORDER BY newsid DESC

aspx里面只需给SQL传入pageid和条数即可。

CSDN上还有个存储过程实现分页的代码:

ALTER PROCEDURE news_Showlist(@tblNamevarchar(255),;;;;-- 表名@strGetFields varchar(1000),; -- 需要返回的列@fldName varchar(255),;;;-- 排序的字段名@PageSizeint ,; -- 页尺寸@PageIndex; int ,-- 页码@strWhere; varchar(1500),; -- 查询条件(注意: 不要加where)@Sort varchar(255);;;--排序的方法

)ASdeclare @strSQLvarchar(5000);;;;-- 主语句declare @strTmpvarchar(110);;;;;-- 临时变量declare @strOrder varchar(400);;;;;-- 排序类型

if @Sort = 'desc'beginset @strTmp = '<(select min'set @strOrder = ' order by ' + @fldName +' desc'--如果@OrderType不是,就执行降序,这句很重要!endelsebeginset @strTmp = '>(select max'set @strOrder = ' order by ' + @fldName +' asc'endif @PageIndex = 1beginif @strWhere != '' beginset @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '; from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder endelse beginset @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '; from '+ @tblName + ' '+ @strOrder end--如果是第一页就执行以上代码,这样会加快执行速度endelsebegin--以下代码赋予了@strSQL以真正执行的SQL代码set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '; from '+ @tblName + ' where ' + @fldName + '' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrderif @strWhere != ''set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '; from '+ @tblName + ' where ' + @fldName + '' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '+ @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' '+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrderendexec (@strSQL)RETURN

相关文章: