sql server平台用存储过程进行分页的两种方法

2016-01-29 16:23 4 1 收藏

sql server平台用存储过程进行分页的两种方法,sql server平台用存储过程进行分页的两种方法

【 tulaoshi.com - SQLServer 】

 

killergo的专栏

最近因为稍微有点空闲时间,所以想了下在sql server平台用存储过程的分页方式,现在列示在下面。

实际测试时,在15000条数据情况下两者性能大体相当,在20000-30000条数据的情况下前者明显比后者性能更佳。更大数据量没有进行测试了。

注意,数据表里面是否有 键和索引 对性能的影响相当大
-----------------------------------------------------
第一种:

/*第一个参数是每页条数,第二个参数是目标页码*/

CREATE proc sp_fixpage @pagesize int,@destpage int  as
set nocount on
declare @id int
declare @startid int

select @startid = (@destpage - 1)*@pagesize

set rowcount @startid
select @id = id from t_member

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

set rowcount @pagesize
set nocount off
select * from t_member where id @id order by id
GO


第二种:

CREATE PROCEDURE sp_fixpage1 @pagesize int ,@destpage int
as
set nocount on
 
CREATE TABLE #myTable(
 [ID] [int] NOT NULL ,
 [UserName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [Origin] [int] NULL ,
 [LatencyBuyDegree] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [UserType] [varchar] (2) COLLATE Chinese_PRC_CI_AS NULL ,
 [Email] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [UserLev] [int] NULL ,
 [RegTime] [datetime] NULL ,
 [RegMode] [bit] NULL ,
 [PaperNum] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [UserClass] [bit] NULL ,
 [password] [binary] (64) NULL ,
 [Tel] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [drass] [varchar] (150) COLLATE Chinese_PRC_CI_AS NULL ,
 [Zip] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [PaperNumlb] [int] NULL ,
 [OpUser] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [Province] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [BirthDate] [datetime] NULL
) ON [PRIMARY]

declare @tempPos int
declare @absPos int
declare @nowID int

set @tempPos = 1
set @absPos = 1

if @destpage 1
    set @absPos = (@pagesize*(@destpage- 1) + 1)

   declare myCursor scroll cursor for
      select [ID] from t_member order by id

open myCursor
fetch absolute @absPos from myCursor into @nowID

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

while (@@fetch_status = 0) and (@tempPos <= @pagesize)
begin
  set @tempPos = @tempPos + 1
  insert into #myTable select * from t_member where [ID] = @nowID
  fetch next from myCursor into @nowID
end

close myCursor
deallocate myCursor

set nocount off
 
select * from #myTable
drop table #myTable
GO

 

来源:http://www.tulaoshi.com/n/20160129/1498489.html

延伸阅读
标签: SQLServer
  存储过程、存储函数的加密:WITH ENCRYPTION <!--[if !supportLineBreakNewLine]-- <!--[endif]-- CREATE procedure dbo.sp_XML_main @table_name nvarchar(260)='', @dirname nvarchar(20)='' WITH ENCRYPTION as begin .................................................... end go     存储过程、存...
代码如下: create database Test on primary ( name='Test_Data.mdf', filename='D:\我的资料\sql\备份\Test_Data.mdf' ) log on ( name='Test_Data.ldf', filename='D:\我的资料\sql\备份\Test_Data.ldf' ) if object_id('tb') is not null drop table tb create table tb ( Col int ) insert into tb select top 50 number ...
标签: SQLServer
  SQLSERVER估计是为了安装或者其它方面,它内置了一批危险的存储过程。能读到注册表信息,能写入注册表信息,能读磁盘共享信息等等……各位看到这儿,心里可能会在想,我的网站中有其它的代码,又不像查询分析器那样能直接将结果输出。给你这个权限,也不能怎么样,还是看不到信息。如果各位这样想就大错特错了。提示一下,如果攻击...
其实在很多时候设计的度还是要把握的,不至于让自己陷入的怪圈中才是最重要的,因为我们还要留出时间还解决其他的很多问题,个人认为适度就可以了,留出一定的空间。也因为万能是不存在的,万物在一定的范畴之内都是合理的,出了范畴可能就没有合理的了。          分页存储过程大致有下列几种 1、&n...
标签: SQLServer
优点如下,简单,直接sql语句输入,高效,效率很高测试过了,不过最好是主键排序,还有少用视图 。 缺点也有,不支持复杂的sql语句,不能多字段排序,sql语句必须小于4000字符 /*   经测试,在 14483461 条记录中查询第 100000 页,每页 10 条记录按升序和降序第一次时间均为 0.47 秒,第二次时间均为 0.43 秒,测试语法如下:   exe...

经验教程

403

收藏

86
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部