zoukankan      html  css  js  c++  java
  • 可按任意字段排序的分页存储过程

     
    第二种方案的思想是这样的,先用倒序的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

  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/gdjlc/p/2086967.html
Copyright © 2011-2022 走看看