zoukankan      html  css  js  c++  java
  • Sql Server 存储过程分页

    通常我们定义分页时都采用存储过程分页,特别是在数据量大的时候.
    我们先看一个例子,以下代码是在sql 2005下的存储过程分页:
    Create PROCEDURE [dbo].[TestTable_GetList]
     @CurrentPage int, @PageSize int, @RecordCount int output
    AS
     DECLARE @MinPage int, @MaxPage int
     SET @MinPage = (@CurrentPage - 1) * @PageSize + 1
     SET @MaxPage = @MinPage + @PageSize
     
     BEGIN
      SELECT * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY ID DESC) AS RowNumber FROM TestTable) AS A WHERE RowNumber BETWEEN @MinPage AND @MaxPage
     
      SELECT @RecordCount = COUNT(SoftID) FROM TestTable
     END
    其中在select指定记录(既在获取第N页的内容)时,采用了sql2005的新特性:ROW_NUMBER()方法,为排序后的每一条记录进行RowNumber指定序号,这样,在sql2005下使用存储过程分页很方便.

    现在我们回到普通sql 2000的情况下,我们可以采用以下几种方式来进行select:
    分页方案一:(利用Not In和SELECT TOP分页)
    语句形式:(接着上述定义,替换Begin end 内容)
    BEGIN
       SELECT TOP @MaxPage
     *
    FROM TestTable
    WHERE (ID NOT IN
              (SELECT TOP 
    @MinPage id
             FROM TestTable
             ORDER BY id))
    ORDER BY ID
       END

    以下方案不不适合上述定义,仅作参考(来自网上)
    -------------------------------------

    分页方案二:(利用ID大于多少和SELECT TOP分页,不太合适.)
    语句形式:
    SELECT TOP 
    10 *
    FROM TestTable
    WHERE (ID 
    >
              (SELECT MAX(id)
             FROM (SELECT TOP 
    20 id
                     FROM TestTable
                     ORDER BY id) AS T))
    ORDER BY ID


    SELECT TOP 页大小 
    *
    FROM TestTable
    WHERE (ID 
    >
              (SELECT MAX(id)
             FROM (SELECT TOP 页大小
    *页数 id
                     FROM 表
                     ORDER BY id) AS T))
    ORDER BY ID


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

    分页方案三:(利用SQL的游标存储过程分页)
    create  procedure XiaoZhengGe
    @sqlstr nvarchar(
    4000), --查询字符串
    @currentpage 
    int--第N页
    @pagesize 
    int --每页行数
    as
    set nocount on
    declare @P1 
    int--P1是游标的id
     @rowcount 
    int
    exec sp_cursoropen @P1 output,@sqlstr,@scrollopt
    =1,@ccopt=1,@rowcount=@rowcount output
    select ceiling(
    1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
    set @currentpage=(@currentpage-1)*@pagesize+1
    exec sp_cursorfetch @P1,
    16,@currentpage,@pagesize 
    exec sp_cursorclose @P1
    set nocount off

    其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
    建议优化的时候,加上主键和索引,查询效率会提高。

    通过SQL 查询分析器,显示比较:我的结论是:
    分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
    分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
    分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用

    在实际情况中,要具体分析。 

  • 相关阅读:
    c# WF 第11节 RichTextBox
    c# WF 第10节 textbox 控件
    c# WF 第9节 button控件
    c# WF 第8节 label控件
    c# WF 第7节 对控件的基本操作
    c# WF 第6节 MDI窗体
    c# WF 第5节 窗体的控件
    Python接口自动化之动态数据处理
    Saturn分布式调度之系统架构简介
    Jmeter系列之接口依赖
  • 原文地址:https://www.cnblogs.com/chf/p/615588.html
Copyright © 2011-2022 走看看