zoukankan      html  css  js  c++  java
  • SQL分页查询过程

    CREATE PROCEDURE [dbo].[sp_GetPageData]
    @TableName NVARCHAR(max), -- 表名
    @GetFields NVARCHAR(max) = '*', -- 字段名(全部字段为*)
    @OrderField NVARCHAR(max), -- 排序字段(必须!支持多字段)
    @WhereCondition NVARCHAR(max) = Null, -- 条件语句(不用加where)
    @PageIndex int = 1 , -- 指定当前为第几页
    @PageSize int = 20, -- 每页多少条记录
    @GroupBy varchar(800), --分组语句(不用加Group by)
    @RecordCount int = 0 output --返回总记录条数
    as begin
    declare @PageCount int -- 返回总页数
    set @PageCount = 0
    --- Begin Tran --开始事务
    Declare @sql nvarchar(max);
    --计算总记录数
    if(@GroupBy ='' or @GroupBy is null) --无GroupBy的情况
    begin
    set @sql = 'select @RecordCount = count(1) from ' + @TableName
    if (@WhereCondition<>'' and @WhereCondition is not NULL)
    set @sql = @sql + ' where ' + @WhereCondition
    end
    else --有GroupBy的情况
    begin
    set @sql = 'select @Recordcount=count(1) from(select 1 as total from ' + @TableName
    if (@WhereCondition<>'' and @WhereCondition is not NULL)
    set @sql = @sql + ' where ' + @WhereCondition
    set @sql = @sql + ' group by ' + @GroupBy
    set @sql = @sql + ') as t'
    end
    EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT--计算总记录数
    select @PageCount=CEILING((@RecordCount+0.0)/@PageSize) --计算总页数
    set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @GetFields + ' from ' + @TableName
    if (@WhereCondition<>'' and @WhereCondition is not NULL)
    set @sql = @sql + ' where ' + @WhereCondition
    if(@GroupBy <>'' and @GroupBy is not null)
    set @sql = @sql + ' group by ' + @GroupBy
    --处理页数超出范围情况
    if @PageIndex<=0
    Set @PageIndex = 1
    if @PageIndex>@PageCount
    Set @PageIndex = @PageCount
    --处理开始点和结束点
    Declare @StartRecord int
    Declare @EndRecord int
    set @StartRecord = (@PageIndex-1)*@PageSize + 1
    set @EndRecord = @StartRecord + @PageSize - 1
    --继续合成sql语句
    SET @TableName='rowtable';
    set @Sql = @Sql + ') as temptable where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord)
    Exec(@Sql)
    ---------------------------------------------------
    If @@Error <> 0
    Begin
    -- RollBack Tran
    Return -1
    End
    Else
    Begin
    --Commit Tran
    Return @RecordCount ---返回记录总数
    End
    end

  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/josn1984/p/6652075.html
Copyright © 2011-2022 走看看