文章探索:   分类:    关键字:  
  + 栏目导航
  + 相关文章
SQL Server 不存在或访问被拒绝
未与信任SQL Server连接相关联的解决..
SQL Server数据库六种数据移动方法
提高数据库访问速度
如何在两个SQLSERVER之间数据同步
将ACCESS的数据库转化为SQL SERVER的..
动态创建SQL Server数据库、表、存储..
在SQL Server中寻找资料库的TABLE数量..
SQL Server 7.0储存过程调试指南
关于SQL Server 2000的安全配置
用SQL语句来建立跟踪的问题
SQL SERVER2000备份和恢复存储过程
将Excel中的数据导入到SQL Server 200..
SQL Server数据库文件恢复技术
千万级数据库高速分页显示
找出存放用户名和密码的表
SQL Server 7六种数据移动方法
SQL Server中读取XML文件的简单做法
SQL Server 2000中的触发器使用
SQL Server中各个系统表的作用
在SQL Server存储过程中执行DTS包
Sqlserver中的一些技巧
SQL Server 2005:数据类型最大值
SQL Server 存储过程的分页
SQL Server 中易混淆的数据类型
SQL Server 服务器安装剖析
SQL Server导出导入数据方法
SQL数据恢复问题深入剖析
SQLServer和Oracle常用函数对比
用SQL Server为Web浏览器提供图像(一..


技术教程 -> SQLserver教程 ->  
SQL Server 存储过程的分页
来源:csdn   人气:839   录入时间:2007-11-8
    建立表:
   
   CREATE TABLE [TestTable] (
   [ID] [int] IDENTITY (1, 1) NOT 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/@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的游标存储过程分页) 效率最差,但是最为通用
   
   在实际情况中,要具体分析。
   
   




Copyright(C)2007-2024 广州市佳沛数码科技有限公司 版权所有
公司地址: 广州市荔湾区东漖北路560号511室
电话:020-81803473 传真:020-81544987