分页

USE [DTMIS_LZ]
GO
/****** Object:  StoredProcedure [dbo].[spPaginationPK]    Script Date: 03/10/2016 18:33:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO



ALTER  PROCEDURE [dbo].[spPaginationPK]
    @TableName varchar(2000),        --表名或视图名
    @Fields varchar(5000)='*',        --要返回的列
    @OrderField varchar(5000),        --排序字段
    @PK varchar(255),                --主键
    @SqlWhere varchar(max) = '',    --查询条件(不要加WHERE)
    @PageSize int,                    --页尺寸
    @PageIndex int=1,                --页码
    @TotalPage int OUTPUT,            --总页数
    @TotalRecord int OUTPUT            --记录总数 
AS
DECLARE @strSql nvarchar(max)
DECLARE @strOrder nvarchar(max)

IF @SqlWhere IS NULL
    BEGIN
        SET @SqlWhere = ''
    END 
IF len(@SqlWhere) > 0
    BEGIN
        SET @strSql = N'SELECT  @TotalRecord =  COUNT(*)  FROM ' + @TableName + N' WHERE ' + @SqlWhere
    END
ELSE
    BEGIN
        SET @strSql =N'SELECT  @TotalRecord =  COUNT(*)  FROM ' + @TableName
    END
    
EXEC sp_executesql @strSql,N'@TotalRecord int OUTPUT',@TotalRecord OUTPUT
SET @TotalPage = ceiling(@TotalRecord * 1.0 / @PageSize)

DECLARE @sql varchar(max)

--实际总共的页码小于当前页码   或者   最大页码 
IF  @TotalPage >= 1
    --如果分页后页数大于0 
   BEGIN 
       IF @TotalPage <= @PageIndex and @TotalPage >=1
          --如果实际总共的页数小于datagrid索引的页数 
          --or   @TotalPage=1 
         BEGIN 
         --设置为最后一页 
             SET @PageIndex=@TotalPage 
         END 
      IF @TotalPage <= @PageIndex and @TotalPage=0 
         BEGIN 
             SET @PageIndex=1;
         END 
   END 
   
   DECLARE @ReSerial int
   SET @ReSerial=(@PageIndex-1)*@PageSize
   
IF @PageIndex = 1 or @TotalPage <= 1     --如果为第一页 
   BEGIN 
      IF len(@SqlWhere)   =0 
         BEGIN 
            SET   @sql = N'SELECT TOP ' + str(@PageSize) + N' ' + @Fields + N',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+N' as rowId FROM ' + @TableName + N' ORDER BY ' + @OrderField + N' '
         END 
      ELSE 
         BEGIN 
             SET   @sql = N'SELECT TOP ' + str( @PageSize) + N' ' + @Fields + N',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+N' as rowId FROM ' + @TableName + N' WHERE ' + @SqlWhere + N' ORDER BY ' + @OrderField + N' '
       END 
   END 
ELSE IF @PageIndex = @TotalPage   --如果为最后一页                       
   BEGIN 
       IF len(@SqlWhere) = 0 
          BEGIN 
              SET @sql = N'SELECT ' + @Fields + N',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+N' as rowId FROM ' + @TableName + N' WHERE ' + @PK + N' not in(SELECT top ' + str(@PageSize * (@PageIndex - 1))  + N' ' + @PK+ N' FROM ' + @TableName + N' ORDER BY ' + @OrderField + N' ' + N') ORDER BY '+ @OrderField + N' '
          END 
       ELSE 
          BEGIN 
             SET  @sql = ' SELECT ' + @Fields + ',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+' as rowId FROM ' + @TableName + ' WHERE ' + @PK + ' not in (SELECT top ' + str(@PageSize *  (@PageIndex - 1)) + ' ' + @PK + ' FROM ' + @TableName + ' WHERE ' + @SqlWhere + ' ORDER BY ' + ' ' + @OrderField + ' ' + ') AND ' + @SqlWhere + ' ORDER BY ' + @OrderField + ' '
          END 
   END 
ELSE   --否则执行   
   BEGIN 
       IF len(@SqlWhere) = 0
          BEGIN 
              SET  @sql = N'SELECT TOP ' + str(@PageSize)  + N' ' + @Fields + N',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+N' as rowId  FROM ' + @TableName + N'  WHERE '+ @PK + N' not in(SELECT top ' + str(@PageSize *  (@PageIndex - 1)) + N' ' + @PK + N' FROM ' + @TableName + N' ORDER BY ' + @OrderField + N' ' + N') ORDER BY ' + @OrderField + N' '
          END 
       ELSE 
          BEGIN 
             SET @sql = 'SELECT TOP ' + str(@PageSize)  + ' ' + @Fields+ ',ROW_NUMBER() Over(order by ' + @OrderField + ')+'+str(@ReSerial)+' as rowId FROM ' + @TableName + ' WHERE ' + @PK + ' not in(SELECT top ' + str(@PageSize *  (@PageIndex - 1)) + ' ' + @PK + ' FROM ' + @TableName + ' WHERE ' + @SqlWhere + ' ORDER BY ' + @OrderField + ' ' + ' ) and ' + @SqlWhere + ' ORDER BY ' + @OrderField + ' '
          END 
    END
EXEC(@sql)
USE [DTMIS_LZ]
GO
/****** Object:  StoredProcedure [dbo].[spPagination]    Script Date: 03/10/2016 18:32:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER Procedure [dbo].[spPagination]
 @TableName varchar(2000),        --表名
 @Fields varchar(5000) = '*',    --字段名(全部字段为*)
 @OrderField varchar(5000),        --排序字段(必须!支持多字段)
 @PK varchar(255),                --主键(不使用)
 @SqlWhere varchar(5000) = '',--条件语句(不用加where)
 @PageSize int,                    --每页多少条记录
 @PageIndex int = 1 ,            --指定当前为第几页
 @TotalPage int output,            --返回总页数 
 @TotalRecord int output
as
begin

    Declare @sql nvarchar(max);

    --计算总记录数         
    if (@SqlWhere='' or @SqlWhere is NULL)
        set @sql = 'select @TotalRecord = count(*) from ' + @TableName
    else
        set @sql = 'select @TotalRecord = count(*) from ' + @TableName + ' where ' + @SqlWhere

    EXEC sp_executesql @sql,N'@TotalRecord int OUTPUT',@TotalRecord OUTPUT--计算总记录数 

    --计算总页数
    select @TotalPage=CEILING((@TotalRecord+0.0)/@PageSize)

    if (@SqlWhere='' or @SqlWhere is NULL)
        set @sql = 'select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' into #t from ' + @TableName 
    else
        set @sql = 'select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' into #t from ' + @TableName + ' where ' + @SqlWhere    
        
    --处理页数超出范围情况
    if @PageIndex<=0 
        Set @PageIndex = 1
    
    if @PageIndex>@TotalPage
        Set @PageIndex = @TotalPage

     --处理开始点和结束点
    Declare @StartRecord int
    Declare @EndRecord int
    
    set @StartRecord = (@PageIndex-1)*@PageSize + 1
    set @EndRecord = @StartRecord + @PageSize - 1

    --继续合成sql语句
    --set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
    

     --得到临时表
     set @sql=@sql+'; select * from  #t  ' + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)
     set @sql=@sql+';drop table #t'
     Exec(@Sql) 
    
     Return @TotalRecord ---返回记录总数
  
end
原文地址:https://www.cnblogs.com/muxueyuan/p/5262992.html