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

    建立表: 

    CREATE TABLE [TestTable] ( 
    [ID] [int] IDENTITY (11NOT NULL , 
    [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , 
    [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , 
    [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , 
    [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL 
    ON [PRIMARY] 
    GO 



    插入数据:(2万条,用更多的数据测试会明显一些) 
    SET IDENTITY_INSERT TestTable ON 

    declare @i int 
    set @i=1 
    while @i<=20000 
    begin 
    insert into TestTable([id], FirstName, LastName, Country,Note) values(@i'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX'
    set @i=@i+1 
    end 

    SET IDENTITY_INSERT TestTable OFF 



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

    分页方案一:(利用Not In和SELECT TOP分页) 
    语句形式: 
    SELECT TOP 10 * 
    FROM TestTable 
    WHERE (ID NOT IN 
    (
    SELECT TOP 20 id 
    FROM TestTable 
    ORDER BY id)) 
    ORDER BY ID 


    SELECT TOP 页大小 * 
    FROM TestTable 
    WHERE (ID NOT IN 
    (
    SELECT TOP 页大小*页数 id 
    FROM 表 
    ORDER BY id)) 
    ORDER BY ID 

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

    分页方案二:(利用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/@pagesizeas 总页数--,@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的游标存储过程分页) 效率最差,但是最为通用 

    在实际情况中,要具体分析。
  • 相关阅读:
    如何降低客户流失率高的问题
    移动端时代如何进行营销革命
    EDM备忘录:触发式邮件订阅和退订功能介绍
    EDM博主笔记:EDM邮件营销的几个细节问题
    转载好文:如何进行基于情境数据的个性化EDM数据营销
    个性化EDM数据营销的三大提醒
    许可EDM营销是个长期过程
    内容营销三大实用法则(内含干货)-同样可运用在EDM数据营销中
    改善EDM数据营销的关键点
    《FS Book》: 如何让圣诞节邮件营销与众不同
  • 原文地址:https://www.cnblogs.com/xiaozhang/p/279626.html
Copyright © 2011-2022 走看看