分页存储过程(两个)

一个人想着一个人 提交于 2020-03-25 14:06:27
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER Procedure [dbo].[Proc_splitPage]
@TableName varchar(50),        --表名
@Fields varchar(5000= '*',    --字段名(全部字段为*)
@OrderField varchar(5000),        --排序字段(必须!支持多字段)
@sqlWhere varchar(5000= Null,--条件语句(不用加where)
@pageSize int,                    --每页多少条记录
@pageIndex int = 1 ,            --指定当前为第几页
@TotalPage int output            --返回总页数 
as
begin

    
Begin Tran --开始事务

    
Declare @sql nvarchar(4000);
    
Declare @totalRecord int;    

    
--计算总记录数
         
    
if (@SqlWhere='' or @sqlWhere=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=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 ' + @TableName + ' 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 @totalRecord ---返回记录总数
      End    
end


-------------------------------------------------------------------------------------------

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[GetRecordByPage]
     
@tblName       varchar(255),       -- 表名
     @fldName       varchar(255),       -- 主键字段名
     @selectContent VARCHAR(255),  --查询的列名,为空则查询所有列
     @PageSize     int,     -- 页尺寸
     @PageIndex     int,             -- 页码
     @IsReCount     bit,             -- 返回记录总数, 非 0 值则返回
     @OrderType     bit,             -- 设置排序类型, 非 0 值则降序
     @strWhere     varchar(1000)   -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL   varchar(6000)       -- 主语句
declare @strTmp   varchar(100)         -- 临时变量
declare @strOrder varchar(400)         -- 排序类型

if @OrderType != 0
begin
     
set @strTmp = '<(select min'
     
set @strOrder = ' order by [' + @fldName +'] desc'
end
else
begin
     
set @strTmp = '>(select max'
     
set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select top ' + str(@PageSize+' ' + @selectContent +'  from ['
     
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
     
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' ['
     
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
     
+ @strOrder

if @strWhere != ''
     
set @strSQL = 'select top ' + str(@PageSize+ ' * from ['
         
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
         
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize+ ' ['
         
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
         
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
     
set @strTmp =''
     
if @strWhere != ''
         
set @strTmp = ' where ' + @strWhere

     
set @strSQL = 'select top ' + str(@PageSize+ ' * from ['
         
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end

if @IsReCount != 0
     
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere

exec (@strSQL)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!