存储过程分页方法3种(转贴)

应该是csdn的邹建大大写的吧...

 

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER procedure  [dbo].[pager]
(
--取得当前页数
@pagenum int,
--取得每页记录数
@rowcount int,
--返回记录总数
@count int output
)
 AS

--定义起始记录ID
declare @start int
--定义结束记录ID
declare @end int
--设置起始记录ID,与当前页数和每页记录数相关。
set @start=@pagenum*@rowcount
--设置结束记录ID,与当前页数和每页记录数相关,起始记录ID减去每页记录数即为当前页的记录数。
set @end=@start-@rowcount
--设置选取记录数
set rowcount @start
--将选取的记录插入临时表
select *  into #t1  from  T_Temp_NetMeasure_MAvg

--设置删除的记录数
set rowcount @end
--不是第一页时删除表,第一页时不删除表中数据。
if @end>0
--删除临时表中不必要的数据
delete #t1

--不限制选取的记录数
set rowcount 0
--显示临时表中的数据
select * from #t1

--declare @count int
select @count=count(*)  from  T_Temp_NetMeasure_MAvg
--------------------------------------------------------------------------------------------------
alter PROCEDURE [dbo].[Bto_Select_tables]
(
@Tables varchar(1000),--表名称,视图
@PrimaryKey varchar(100),--主关键字
@Sort varchar(200),--排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
@CurrentPage int,--当前页码
@PageSize int,--分页尺寸
@Fields varchar(1000) ,--数据列
@Filter varchar(1000),--过滤语句,不带Where
@Group varchar(1000) --Group语句,不带Group By
)
AS

/*默认排序*/
IF @Sort IS NULL OR @Sort = ''
SET @Sort = @PrimaryKey

DECLARE @SortTable varchar(100)
DECLARE @SortName varchar(100)
DECLARE @strSortColumn varchar(200)
DECLARE @operator char(2)
DECLARE @type varchar(100)
DECLARE @prec int

/*设定排序语句.*/
IF CHARINDEX('DESC',@Sort)>0
BEGIN
SET @strSortColumn = REPLACE(@Sort, 'DESC', '')
SET @operator = '<='
END
ELSE
BEGIN
IF CHARINDEX('ASC', @Sort) = 0
SET @strSortColumn = REPLACE(@Sort, 'ASC', '')
SET @operator = '>='
END


IF CHARINDEX('.', @strSortColumn) > 0
BEGIN
SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
END
ELSE
BEGIN
SET @SortTable = @Tables
SET @SortName = @strSortColumn
END

SELECT @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName

IF CHARINDEX('char', @type) > 0
   SET @type = @type + '(' + CAST(@prec AS varchar) + ')'

DECLARE @strPageSize varchar(50)
DECLARE @strStartRow varchar(50)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)

/*默认当前页*/
IF @CurrentPage < 1
SET @CurrentPage = 1

/*设置分页参数.*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1) AS varchar(50))

/*筛选以及分组语句.*/
IF @Filter IS NOT NULL AND @Filter != ''
BEGIN
SET @strFilter = ' WHERE ' + @Filter + ' '
SET @strSimpleFilter = ' AND ' + @Filter + ' '
END
ELSE
BEGIN
SET @strSimpleFilter = ''
SET @strFilter = ''
END
IF @Group IS NOT NULL AND @Group != ''
SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
SET @strGroup = ''

/*执行查询语句*/
print(
'
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER

BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' +

@strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
'
)
GO

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
---------------------------------------------------------------------------------------------------------
ALTER PROCEDURE [dbo].[Bto_Select_tables]
@tblName   varchar(255),       -- 表名
@strGetFields varchar(1000),  -- 需要返回的列
@fldName varchar(255),      -- 排序的字段名
@PageSize   int ,          -- 页尺寸
@PageIndex  int ,           -- 页码
@doCount  bit,   -- 返回记录总数, 非 0 值则返回
@OrderType bit,  -- 设置排序类型, 非 0 值则降序
@strWhere  varchar(1500)  -- 查询条件 (注意: 不要加 where)

AS
--declare @tblName varchar(255)   -- 表名
--declare @strGetFields varchar(1000)  -- 需要返回的列
--declare @fldName varchar(255)    -- 排序的字段名
--declare @PageSize   int        -- 页尺寸
--declare @PageIndex  int         -- 页码
--declare @doCount  bit  -- 返回记录总数, 非 0 值则返回
--declare @OrderType bit -- 设置排序类型, 非 0 值则降序
--declare @strWhere  varchar(1500)
--
--set @tblName='T_Ilab_User'
--set @strGetFields='ID,username'
--set @fldName='ID'
--set @PageSize=20
--set @PageIndex =1
--set @doCount=0
--set @OrderType=0
--set @strWhere=''

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

declare @num int, @sqls nvarchar(4000)

    if @strWhere !=''
    set @sqls = 'select @a=count(*) from [' + @tblName + '] where ' + @strWhere
    else
    set @sqls = 'select @a=count(*) from [' + @tblName + ']'

exec sp_executesql @sqls,N'@a int output',@num output

 

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

else
begin
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

if @PageIndex = 1
begin
    if @strWhere != ''  
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder
     else
     set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['+ @tblName + '] '+ @strOrder
end

else
begin
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  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) +' '+@strGetFields+ '  from ['
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
        + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
        + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end

end
return select @num 
--EXEC (@strSQL)

--------------------------邹建分页法----------------------------------------------------------------------------
CREATE   Proc   p_show  
  @QueryStr   nvarchar(4000),   --表名、视图名、查询语句  
  @PageSize   int,       --每页的大小(行数)  
  @PageCurrent   int,       --要显示的页  
  @FdShow   nvarchar   (4000)='',   --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段  
  @FdOrder   nvarchar   (1000)=''   --排序字段列表  
  as  
  declare   @FdName   nvarchar(250)   --表中的主键或表、临时表中的标识列名  
    ,@Id1   varchar(20),@Id2   varchar(20)   --开始和结束的记录号  
    ,@Obj_ID   int         --对象ID  
  --表中有复合主键的处理  
  declare   @strfd   nvarchar(2000)   --复合主键列表  
    ,@strjoin   nvarchar(4000)   --连接字段  
    ,@strwhere   nvarchar(2000)   --查询条件  
   
   
  select   @Obj_ID=object_id(@QueryStr)  
    ,@FdShow=case   isnull(@FdShow,'')   when   ''   then   '   *'   else   '   '+@FdShow   end  
    ,@FdOrder=case   isnull(@FdOrder,'')   when   ''   then   ''   else   '   order   by   '+@FdOrder   end  
    ,@QueryStr=case   when   @Obj_ID   is   not   null   then   '   '+@QueryStr   else   '   ('+@QueryStr+')   a'   end  
   
  --如果显示第一页,可以直接用top来完成  
  if   @PageCurrent=1    
  begin  
    select   @Id1=cast(@PageSize   as   varchar(20))  
    exec('select   top   '+@Id1+@FdShow+'   from   '+@QueryStr+@FdOrder)  
    return  
  end  
   
  --如果是表,则检查表中是否有标识更或主键  
  if   @Obj_ID   is   not   null   and   objectproperty(@Obj_ID,'IsTable')=1  
  begin  
    select   @Id1=cast(@PageSize   as   varchar(20))  
      ,@Id2=cast((@PageCurrent-1)*@PageSize   as   varchar(20))  
   
    select   @FdName=name   from   syscolumns   where   id=@Obj_ID   and   status=0x80  
    if   @@rowcount=0       --如果表中无标识列,则检查表中是否有主键  
    begin  
      if   not   exists(select   1   from   sysobjects   where   parent_obj=@Obj_ID   and   xtype='PK')  
        goto   lbusetemp     --如果表中无主键,则用临时表处理  
   
      select   @FdName=name   from   syscolumns   where   id=@Obj_ID   and   colid   in(  
        select   colid   from   sysindexkeys   where   @Obj_ID=id   and   indid   in(  
          select   indid   from   sysindexes   where   @Obj_ID=id   and   name   in(  
            select   name   from   sysobjects   where   xtype='PK'   and   parent_obj=@Obj_ID  
        )))  
      if   @@rowcount>1     --检查表中的主键是否为复合主键  
      begin  
        select   @strfd='',@strjoin='',@strwhere=''  
        select   @strfd=@strfd+',['+name+']'  
          ,@strjoin=@strjoin+'   and   a.['+name+']=b.['+name+']'  
          ,@strwhere=@strwhere+'   and   b.['+name+']   is   null'  
          from   syscolumns   where   id=@Obj_ID   and   colid   in(  
          select   colid   from   sysindexkeys   where   @Obj_ID=id   and   indid   in(  
            select   indid   from   sysindexes   where   @Obj_ID=id   and   name   in(  
              select   name   from   sysobjects   where   xtype='PK'   and   parent_obj=@Obj_ID  
          )))  
        select   @strfd=substring(@strfd,2,2000)  
          ,@strjoin=substring(@strjoin,5,4000)  
          ,@strwhere=substring(@strwhere,5,4000)  
        goto   lbusepk  
      end  
    end  
  end  
  else  
    goto   lbusetemp  
   
  /*--使用标识列或主键为单一字段的处理方法--*/  
  lbuseidentity:    
    exec('select   top   '+@Id1+@FdShow+'   from   '+@QueryStr  
      +'   where   '+@FdName+'   not   in(select   top   '  
      +@Id2+'   '+@FdName+'   from   '+@QueryStr+@FdOrder  
      +')'+@FdOrder  
      )  
    return  
   
  /*--表中有复合主键的处理方法--*/  
  lbusepk:      
    exec('select   '+@FdShow+'   from(select   top   '+@Id1+'   a.*   from  
      (select   top   100   percent   *   from   '+@QueryStr+@FdOrder+')   a  
      left   join   (select   top   '+@Id2+'   '+@strfd+'    
      from   '+@QueryStr+@FdOrder+')   b   on   '+@strjoin+'  
      where   '+@strwhere+')   a'  
      )  
    return  
   
  /*--用临时表处理的方法--*/  
  lbusetemp:      
  select   @FdName='[ID_'+cast(newid()   as   varchar(40))+']'  
    ,@Id1=cast(@PageSize*(@PageCurrent-1)   as   varchar(20))  
    ,@Id2=cast(@PageSize*@PageCurrent-1   as   varchar(20))  
   
  exec('select   '+@FdName+'=identity(int,0,1),'+@FdShow+'  
      into   #tb   from'+@QueryStr+@FdOrder+'  
    select   '+@FdShow+'   from   #tb   where   '+@FdName+'   between   '  
    +@Id1+'   and   '+@Id2  
    )  
   
  GO  

转载于:https://www.cnblogs.com/gerdy/archive/2007/09/28/909890.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值