ALTER PROCEDURE [dbo].[UP_GetRecordByPage]
@pageSize int = 20, --分页大小
@currentPage int , --第几页
@columns varchar(1000) = '*', --需要得到的字段  
@tableName varchar(100), --需要查询的表   
@condition varchar(1000) = '', --查询条件, 不用加where关键字
@ascColumn varchar(100) = '', --排序的字段名 (即 order by column asc/desc)
@bitOrderType bit = 0, --排序的类型 (0为升序,1为降序)
@pkColumn varchar(50) = '' --主键名称AS
BEGIN --存储过程开始
DECLARE @strTemp varchar(300)
DECLARE @strSql varchar(5000) --该存储过程最后执行的语句
DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc)BEGIN
IF @bitOrderType = 1  --降序
BEGIN
SET @strOrderType = ' O[code=SQL]RDER BY '+@ascColumn+' DESC'
SET @strTemp = '<(SELECT min'
END
ELSE  --升序
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'
SET @strTemp = '>(SELECT max'
ENDIF @currentPage = 1  --第一页
BEGIN
IF @condition != ''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
' WHERE '+@condition+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+@strOrderType
ENDELSE  -- 其他页
BEGIN
IF @condition !=''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
' WHERE '+@condition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+
' '+@pkColumn+' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+' '+@pkColumn+
' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType
ENDEND
EXEC (@strSql)
END
[/code]
升序少输出一页数据,降序少输出两页。。大家看看

解决方案 »

  1.   

    代码太长。。给一个存储过程你参考
    create  PROC sp_PageIndex
     @sqlSelect varchar(800) --SELECT 后面 FROM 前面 的 字段 不用包含SELECT
    ,@sqlFrom varchar(800) --FROM 后面 的 字段 包含FROM
    ,@countPerPage int -- 每页数据行数
    ,@toPage int --要转到的页码ASBEGIN
    -- 根据每页数据行数 和 要转到的页码 得到 数据起止点
    Declare @start int
    Declare @end intset @end = @countPerPage * @toPage
    set @start = @countPerPage * (@toPage - 1) + 1
    -- 临时表名称 可随机命名
    Declare @tmpTable varchar(10)
    SET @tmpTable ='#tmp'Declare @sqlStr varchar(800)
    -- 创建数据源到临时表
    SELECT @sqlStr = 'SELECT Identity(int,1,1) AS RowIndex,'
    SELECT @sqlStr = @sqlStr + rtrim(@sqlSelect) + ' INTO  '+ @tmpTable 
    SELECT @sqlStr = @sqlStr + rtrim(@sqlFrom) 
    -- 查询临时表 得到所需要的数据
    SELECT @sqlStr = @sqlStr + ' '+'SELECT '+ rtrim(@sqlSelect) +' FROM ' + @tmpTable 
    SELECT @sqlStr = @sqlStr + ' WHERE  RowIndex BETWEEN ' + Convert(char,@start) + " AND " + Convert(char,@end)
    -- 删除临时表
    SELECT @sqlStr = @sqlStr + ' '+'DROP TABLE '+@tmpTable
    EXEC (@sqlStr)
    END