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

    /**********************************************************************
    参数:@PrimaryKey 主键,@OrderBy 排序字段,@SqlStr sql语句,@PageSize 每页显示的记录,@PageIndex 当前页(从0开始)
    ***********************************************************************/
    ALTER procedure [dbo].[PageQuery]
    @PrimaryKey varchar(100),--主键
    @OrderBy varchar(100),--排序字段
    @SqlStr varchar(8000),--sql语句
    @PageSize int,--每页显示的记录
    @PageIndex int--当前页(从1开始)
    --@RecordCount int output --返回的总记录数
    as
    declare @ExecSql varchar(8000)--要执行的Sql组合
    if @OrderBy=''
    set @OrderBy='order by '+@PrimaryKey+' asc'
    else if (len(@OrderBy)<8 or upper(substring(@OrderBy,1,8))<>'ORDER BY')
    set @OrderBy='order by '+@OrderBy
    if @PageSize=-1--用于ajax的第一次查询
    set @PageSize=0
    set @PageIndex=@PageIndex-1
    print('-----'+CAST(@PageIndex as varchar(10)) )
    begin
    declare @recordCount int,@pageCount int
    declare @s nvarchar(4000)
    set @s = N'select @recordCount = count('+@PrimaryKey+') from ('+@SqlStr+') TN'
    exec sp_executeSql @s,N'@recordCount int output',@recordCount output
    if(@pageSize>0)
    set @pageCount = (@recordCount - 1 + @PageSize) / @PageSize;--总页数
    else
    set @pageCount = 0;--总页数

    	if @PageIndex<=0--如果是第一页就执行这个
    		begin
    			set @ExecSql='select top '+cast(@PageSize as varchar(100))+' * from ('+@SqlStr+') T '+@OrderBy
    		end
    	else
    		begin
    			if charindex('2000 - 8.00.',@@version)>0
    				begin
    					set @ExecSql=
    					'select top '+cast(@PageSize as varchar(100))+' *
    					from ('+@SqlStr+') as T where T.'+@PrimaryKey+' not in
    					(select top '+cast((@PageSize*@PageIndex) as varchar(100))+' '+@PrimaryKey+'
    						from ('+@SqlStr+') T2 '+@OrderBy+') '+ @OrderBy
    				end
    			else
    				begin
    					set @ExecSql=
    					'select * from
    					(
    						select * from
    						(SELECT *, #RowNum#=ROW_NUMBER() OVER('+@OrderBy+') FROM ('+@SqlStr+') T1) T2 where T2.#RowNum#>='+cast(@PageSize*@PageIndex+1 as varchar(10))+' and T2.#RowNum#<='+cast(@PageSize*(@PageIndex+1) as varchar(10))+'
    					) T3
    					'
    				end
    		end
    		exec (@ExecSql+' select '+@recordCount+' as RecordCount,'+@pageCount+' as PageCount ')
    

    end

  • 相关阅读:
    liunx下手动安装git及配置
    Liunx系统下删除自带的JDK及安装需要的JDK版本
    Pipeline简单实现的代码
    HttpClient-post请求,含图片
    Java
    函数及BOM
    JS--EcmaScript
    定位
    浮动
    盒子模型
  • 原文地址:https://www.cnblogs.com/Yann123/p/11711172.html
Copyright © 2011-2022 走看看