gdjlc

培养良好的习惯,每天一点一滴的进步,终将会有收获。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
 
第二种方案的思想是这样的,先用倒序的SELECT TOP (页序号+1)*页尺寸的方法取得AE结果集,再从AE结果集中用NOT IN 的方法排除掉用SELECT TOP 页序号*页尺寸的方法取得的结果集,最后,对目标结果集执行倒序,下面是实现的代码
滚轮缩放,点击查看大图 create   PROCEDURE  dbo.GetPagingRecord
滚轮缩放,点击查看大图     (
滚轮缩放,点击查看大图         @tablename 
varchar ( 100 ), -- 表名或视图表
滚轮缩放,点击查看大图
        @fieldlist  varchar ( 4000 ) = ' * ' , -- 欲选择字段列表
滚轮缩放,点击查看大图
        @orderfield  varchar ( 100 ), -- 排序字段
滚轮缩放,点击查看大图
        @keyfield  varchar ( 100 ), -- 主键
滚轮缩放,点击查看大图
        @pageindex  int , -- 页号,从0开始
滚轮缩放,点击查看大图
        @pagesize  int = 20 , -- 页尺寸
滚轮缩放,点击查看大图
        @strwhere  varchar ( 4000 ), -- 条件
滚轮缩放,点击查看大图
        @ordertype  bit = 1 -- 排序,1,降序,0,升序
滚轮缩放,点击查看大图
    )
滚轮缩放,点击查看大图
AS
滚轮缩放,点击查看大图
/*
滚轮缩放,点击查看大图 名称:GetPagingRecord
滚轮缩放,点击查看大图 作用:按任意字段进行排序分页
滚轮缩放,点击查看大图 作者:菩提树(MARK MA)
滚轮缩放,点击查看大图 时间:2004-12-14
滚轮缩放,点击查看大图 声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明
滚轮缩放,点击查看大图
*/

滚轮缩放,点击查看大图     
SET  NOCOUNT  ON
滚轮缩放,点击查看大图     
declare  @sqlstr  varchar ( 6000 )
滚轮缩放,点击查看大图     
-- 处理SQL中危险字符,并且将条件处理成易嵌入的形式
滚轮缩放,点击查看大图
     set  @strwhere = replace (@strwhere, '''' , '''''' )
滚轮缩放,点击查看大图     
set  @strwhere = replace (@strwhere, ' -- ' , '' )
滚轮缩放,点击查看大图     
set  @strwhere = replace (@strwhere, ' ; ' , '' )
滚轮缩放,点击查看大图     
set  @sqlstr = ' declare @CurPageNum int; '
滚轮缩放,点击查看大图     
set  @sqlstr = @sqlstr + ' declare @nextpagenum int; '
滚轮缩放,点击查看大图     
set  @sqlstr = @sqlstr + ' set @curpagenum= ' + cast (@PageIndex  as   varchar ) + ' * ' + cast (@Pagesize  as   varchar ) + ' ; '
滚轮缩放,点击查看大图     
set  @sqlstr = @sqlstr + ' set @nextpagenum= ' + cast (@PageIndex + 1   as   varchar ) + ' * ' + cast (@Pagesize  as   varchar ) + ' ; '
滚轮缩放,点击查看大图     
set  @sqlstr = @sqlstr + ' declare @sqlstr varchar(6000); '
滚轮缩放,点击查看大图     
if  @ordertype = 1
滚轮缩放,点击查看大图     
begin
滚轮缩放,点击查看大图     
set  @sqlstr = @sqlstr + ' set @sqlstr= '' select  ' + @fieldlist + '  from ( select top  '' +cast(@nextpagenum as varchar)+ ''  * from 
滚轮缩放,点击查看大图
滚轮缩放,点击查看大图
' + @tablename + '   where  ' + @strwhere + '  order by  ' + @orderfield + '  desc ) as a where  ' + @keyfield + '  not in ( 
滚轮缩放,点击查看大图
滚轮缩放,点击查看大图 select top 
'' +cast(@curpagenum as varchar)+ ''   ' + @keyfield + '  from  ' + @tablename + '  where  ' + @strwhere + '  
滚轮缩放,点击查看大图
滚轮缩放,点击查看大图 order by 
' + @orderfield + '  desc) order by  ' + @orderfield + '  desc '' ; '
滚轮缩放,点击查看大图     
end
滚轮缩放,点击查看大图     
else
滚轮缩放,点击查看大图     
begin
滚轮缩放,点击查看大图     
set  @sqlstr = @sqlstr + ' set @sqlstr= '' select  ' + @fieldlist + '  from ( select top  '' +cast(@nextpagenum as varchar)+ ''  * from 
滚轮缩放,点击查看大图
滚轮缩放,点击查看大图
' + @tablename + '   where  ' + @strwhere + '  order by  ' + @orderfield + '  asc ) as a where  ' + @keyfield + '  not in ( 
滚轮缩放,点击查看大图
滚轮缩放,点击查看大图 select top 
'' +cast(@curpagenum as varchar)+ ''   ' + @keyfield + '  from  ' + @tablename + '  where  ' + @strwhere + '  
滚轮缩放,点击查看大图
滚轮缩放,点击查看大图 order by 
' + @orderfield + '  asc) order by  ' + @orderfield + '  asc '' ; '
滚轮缩放,点击查看大图     
end
滚轮缩放,点击查看大图     
set  @sqlstr = @sqlstr + ' execute( @sqlstr) '
滚轮缩放,点击查看大图     
-- print @sqlstr
滚轮缩放,点击查看大图
     execute (@sqlstr)


==========================================================

2009-9-1 gdjlc  修改:加上了返回记录总数

CREATE PROCEDURE dbo.GetPagingRecord
    (
        @tablename varchar(100),--表名或视图表
        @fieldlist varchar(4000)='*',--欲选择字段列表
        @orderfield varchar(100),--排序字段
        @keyfield varchar(100),--主键
        @pageindex int,--页号,从0开始
        @pagesize int=20,--页尺寸      
        @strwhere varchar(4000),--条件
        @ordertype bit=1--排序,1,降序,0,升序
    )
AS
/**//*
名称:GetPagingRecord
作用:按任意字段进行排序分页
作者:菩提树(MARK MA)
时间:2004-12-14
声明:此代码你可以无偿使用及转载,但在转载时,请勿移称本文字声明
*/
    SET NOCOUNT ON
    declare @sqlstr varchar(6000)
    --处理SQL中危险字符,并且将条件处理成易嵌入的形式
    set @strwhere=replace(@strwhere,'''','''''')
    set @strwhere=replace(@strwhere,'--','')
    set @strwhere=replace(@strwhere,';','')
    set @sqlstr='declare @CurPageNum int;'
    set @sqlstr=@sqlstr+'declare @nextpagenum int;'
    set @sqlstr=@sqlstr+'set @curpagenum='+cast(@PageIndex as varchar)+'*'+cast(@Pagesize as varchar)+';'
    set @sqlstr=@sqlstr+'set @nextpagenum='+cast(@PageIndex+1 as varchar)+'*'+cast(@Pagesize as varchar)+';'
    set @sqlstr=@sqlstr+'declare @sqlstr varchar(6000);'
    if @ordertype=1
    begin
    set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from 
 
'+@tablename+'   where '+@strwhere+' order by '+@orderfield+' desc ) as a where '+@keyfield+' not in ( 
 
select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where '+@strwhere+'  
 
order by '+@orderfield+' desc) order by '+@orderfield+' desc'';'
    end
    else
    begin
    set @sqlstr=@sqlstr+'set @sqlstr=''select '+@fieldlist+' from ( select top ''+cast(@nextpagenum as varchar)+'' * from 
 
'+@tablename+'   where '+@strwhere+' order by '+@orderfield+' asc ) as a where '+@keyfield+' not in ( 
 
select top ''+cast(@curpagenum as varchar)+'' '+@keyfield+' from '+@tablename+' where '+@strwhere+'  
 
order by '+@orderfield+' asc) order by '+@orderfield+' asc'';'
    end
      
    begin
    set @sqlstr =@sqlstr + ' select count(*) as Total from ' + @tablename + ' where  '+ @strwhere + ';'
    end

    set @sqlstr=@sqlstr+'execute( @sqlstr)'
    --print @sqlstr
    execute(@sqlstr)
GO

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

exec GetPagingRecord 'product','id,c_code,p_code,price','price','id',1,10,'1=1',1

posted on 2009-10-27 12:39  gdjlc  阅读(223)  评论(0编辑  收藏  举报