zoukankan      html  css  js  c++  java
  • 一个通用的数据分页的存储过程

    CREATE PROCEDURE sp_page
      @tb         varchar(50), --表名
      @col        varchar(50), --按该列来进行分页
      @coltype    int,        
    --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型
      @orderby    bit,         --排序,0-顺序,1-倒序
      @collist    varchar(800),--要查询出的字段列表,*表示全部字段
      @pagesize   int,         --每页记录数
      @page       int,         --指定页
      @condition  varchar(800),--查询条件
      @pages      int OUTPUT   --总页数
    AS
    /*
    功能描述:对指定表中满足条件的记录按指定列进行分页查询,分页可以顺序、倒序
             查询可以指定页大小、指定查询任意页、指定输出字段列表,返回总页数
    作    者:pbsql
    版    本:1.10
    最后修改:2004-11-29
    */
    DECLARE @sql nvarchar(4000),@where1 varchar(800),@where2 varchar(800)
    IF @condition is null or rtrim(@condition)=''
    BEGIN--没有查询条件
      SET @where1=' WHERE '
      SET @where2='  '
    END
    ELSE
    BEGIN--有查询条件
      SET @where1=' WHERE (
    '+@condition+') AND '--本来有条件再加上此条件
      SET @where2=' WHERE (
    '+@condition+') '--原本没有条件而加上此条件
    END
    SET @sql='SELECT @pages=CEILING((COUNT(*)+0.0)/'+CAST(@pagesize AS varchar)+
             ') FROM
    '+@tb+@where2
    EXEC sp_executesql @sql,N'@pages int OUTPUT',@pages OUTPUT--计算总页数
    IF @orderby=0
      SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+'
    '+@collist+
               ' FROM
    '+@tb+@where1+@col+'>(SELECT MAX('+@col+') '+
               ' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+' '+
               @col+' FROM
    '+@tb+@where2+'ORDER BY '+@col+') t) ORDER BY '+@col
    ELSE
      SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+'
    '+@collist+
               ' FROM
    '+@tb+@where1+@col+'<(SELECT MIN('+@col+') '+
               ' FROM (SELECT TOP '+CAST(@pagesize*(@page-1) AS varchar)+' '+
               @col+' FROM
    '+@tb+@where2+'ORDER BY '+@col+' DESC) t) ORDER BY '+
               @col+' DESC'
    IF @page=1--第一页
      SET @sql='SELECT TOP '+CAST(@pagesize AS varchar)+'
    '+@collist+' FROM '+@tb+
        @where2+'ORDER BY
    '+@col+CASE @orderby WHEN 0 THEN '' ELSE ' DESC' END
    EXEC(@sql)
    GO

    本存储过程高效,曾用500万条数据测试(已建索引),只返回分页只需3秒,影响效率的地方是计算总页数,若不需要可以注释掉

    --测试示例
    declare @pages int
    select identity(int,1,1) id,getdate() dt,xx=cast('' as varchar(10)) into #t
     from sysobjects
    update #t set dt=dateadd(day,id-200,dt),
                  xx='xxxx'+right('000000'+cast(id as varchar(10)),6)

    exec sp_page '#t','id',0,0,'*',10,2,'',@pages output--按id顺序取第二页
    exec sp_page '#t','id',0,1,'*',10,2,'',@pages output--按id倒序取第二页
    exec sp_page '#t','xx',1,0,'*',10,3,'',@pages output--按xx顺序取第三页
    exec sp_page '#t','xx',1,1,'*',10,3,'',@pages output--按xx倒序取第三页
    exec sp_page '#t','dt',2,0,'*',10,2,'',@pages output--按dt顺序取第二页
    exec sp_page '#t','dt',2,1,'*',10,2,'',@pages output--按dt倒序取第二页

    select 总页数=@pages

    drop table #t

    -- 摘自 csdn  pbsql(风云)的贴 
    http://blog.csdn.net/pbsql/archive/2004/11/30/199657.aspx
      

  • 相关阅读:
    Windows Azure Cloud Service (14) 使用Windows Azure诊断收集日志记录数据
    Windows Azure Cloud Service (13) 用Visual Studio 2010 将应用程序部署到Windows Azure平台
    Windows Azure Cloud Service (15) 多个VM Instance场景下如何处理ASP.NET Session
    Windows Azure Storage (5) Windows Azure Drive
    Windows Azure Storage (7) 使用工具管理Windows Azure Storage
    SQL Azure(二) SQL Azure vs SQL Server
    webbrowser的自动提交
    提取视频的背景声音的软件
    Listview列排序的bug原因
    两个奇怪的问题
  • 原文地址:https://www.cnblogs.com/azhai/p/163240.html
Copyright © 2011-2022 走看看