zoukankan      html  css  js  c++  java
  • 高效分页存储过程

    USE [XHXFZ]
    GO
    /****** 对象:  StoredProcedure [dbo].[SP_Page2005]    脚本日期: 04/20/2010 14:48:35 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER  Procedure [dbo].[SP_Page2005]
    @TableName varchar(5000),         --表名
    @Fields varchar(5000) = '*',     --字段名(全部字段为*)
    @OrderField varchar(5000),         --排序字段(必须!支持多字段,逗号隔开)
    @sqlWhere varchar(5000) = Null,--条件语句(不用加where)
    @pageSize int,                     --每页多少条记录
    @pageIndex int = 1 ,             --指定当前为第几页
    @IsStatCounts int = 0,           --是否统计记录数(0不统计,1统计)
    @Counts    int = 0 output,  --查询到的记录数
    @TotalPage int = 0 output             --返回总页数
    as

    begin
     SET NOCOUNT ON

         --Begin Tran --开始事务
     
         Declare @sql nvarchar(4000);
         Declare @totalRecord int ;   
      set @totalRecord=0;
         --计算总记录数
         if( @IsStatCounts =1)
      begin
       if (@SqlWhere='' or @sqlWhere is NULL)
       begin

        set @sql = 'select @totalRecord = count(*) from ' + @TableName
       end
       else
        set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere

       EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数
      set  @Counts=@totalRecord
     
     --计算总页数
         select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)
      end    
       

         if (@SqlWhere='' or @sqlWhere is NULL)
             set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName
         else
             set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' 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 selectTable where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +   Convert(varchar(50),@EndRecord)
       -- print @Sql
         Exec sp_executesql @Sql
     
         ---------------------------------------------------
    --     If @@Error <> 0
    --       Begin
    --         RollBack Tran
    --         Return -1
    --       End
    --      Else
    --       Begin
    --         Commit Tran
    --         Return @totalRecord ---返回记录总数
    --       End   
    end


     

    该文章经过本人整理所得,欢迎转载,转载时请加上本文地址;本文基于署名 2.5 中国大陆许可协议发布,请勿演绎或用于商业目的,但是必须保留本文的署名张志涛(包含链接如您有任何疑问或者授权方面的协商,请给我留言
  • 相关阅读:
    [转载]小谈网络游戏同步
    [ASE][Daily Scrum]11.06
    [Proposal]Tank Battle——Infinite
    [proposal][app]Watch your time!
    [Proposal]Nano-Diary(纳日记)
    LaTeX中用BibTex管理参考文献
    matlab化简符号表达式
    placeholder颜色变化
    链接图片外边出现蓝框(IE8/IE9/IE10)
    图标排列
  • 原文地址:https://www.cnblogs.com/zhangzt/p/1716236.html
Copyright © 2011-2022 走看看