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 中国大陆许可协议发布,请勿演绎或用于商业目的,但是必须保留本文的署名张志涛(包含链接如您有任何疑问或者授权方面的协商,请给我留言
  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/zhangzt/p/1716236.html
Copyright © 2011-2022 走看看