SQL Server存储过程分页(代码)

平常使用PHP开发程序,使用limit分页很是方便,今天用sqlserver做分页,虽然之前也用top n方法做过,但是感觉不是很方便,今天参考网上代码实验了一下使用存储过程分页方法,有一些并不能达到分页效果,最后找到一个可用的SQL Server存储过程分页方法。
使用例子:[PD_GetDataByPage] '用户表', '*', 10, 2 , '','ID',0

存储过程如下(参考网络代码):

例子中使用的where条件只适用于查询数字型的条件,当需要查询字符串或日期条件时因为需要增加引号,需要将查询字段增加到参数中,并且将拼接字符串增加''代替“解决

CREATE PROCEDURE [dbo].[PD_GetDataByPage]
(
    @TableName       varchar(3000),           -- 查询表名
    @ReturnFields    varchar(3000) = '*',     -- 需要返回的列 
    @PageSize        int = 10,                -- 每页记录数
    @PageIndex       int = 0,                 -- 当前页码,第一页为1
    @Where           varchar(3000) = '',      -- 查询条件
    @OrderBy         varchar(200),            -- 排序字段名 最好为唯一主键,这里需要写上
    @OrderType       int = 1                  -- 排序类型 1:降序 其它为升序
)

AS
    DECLARE @TotalRecord int
    DECLARE @TotalPage int
    DECLARE @CurrentPageSize int
    DECLARE @TotalRecordForPageIndex int
    declare @CountSql nvarchar(4000)      

    if @OrderType = 1
        BEGIN
            set @OrderBy = ' Order by ' + REPLACE(@OrderBy,',',' desc,') + ' desc '
        END
    else
        BEGIN
            set @OrderBy = ' Order by ' + REPLACE(@OrderBy,',',' asc,') + ' asc '        
        END    
    -- 总记录

    set @CountSql='SELECT @TotalRecord=Count(*) From '+@TableName+' '+@Where
    execute sp_executesql @CountSql,N'@TotalRecord int out',@TotalRecord out    

    SET @TotalPage=(@TotalRecord-1)/@PageSize+1
   
    -- 查询页数不大于总页数
    if(@PageIndex > @TotalPage)
        set @PageIndex = @TotalPage
    
    SET @CurrentPageSize=(@PageIndex-1)*@PageSize
       
    -- 返回记录
    set @TotalRecordForPageIndex=@PageIndex*@PageSize
    
    exec('SELECT *
            FROM (SELECT TOP '+@TotalRecordForPageIndex+' '+@ReturnFields+', ROW_NUMBER() OVER ('+@OrderBy+') AS ROWNUM
            FROM '+@TableName+ ' ' + @Where +' ) AS TempTable
            WHERE TempTable.ROWNUM > 
            '+@CurrentPageSize)
    

    -- 使用表单独表返回总页数和总记录
    SELECT @TotalPage as PageCount,@TotalRecord as RecordCount

 

你可能感兴趣的:(SQL Server存储过程分页(代码))