MSSQL教程之关于利用存储历程创立分页
由MySQL用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏:创立|存储历程|分页2005-1-4
关于利用存储历程创立分页
明天查询有关sqlserver索引的材料偶然在一篇文章的开端发明一个关于利用存储历程创立分页的代码,间接复制到查询剖析器里有误,收拾调试了一个,搬下去一同进修一下。
注:原作者freedk以下为笔者收拾这是一个绝对最优的办法在大批数据会合体现凸起
创建一个Web使用,分页扫瞄功效必不成少。这个成绩是数据库处置中非常罕见的成绩。典范的数据分页办法是:ADO记录集分页法,也就是使用ADO自带的分页功效(使用游标)来完成分页。但这类分页办法仅合用于较小数据量的情况,由于游标自己出缺点:游标是寄存在内存中,很费内存。游标一创建,就将相干的纪录锁住,直到作废游标。游标供应了对特定汇合中逐行扫描的手腕,一样平常利用游标来逐行遍历数据,依据掏出数据前提的分歧举行分歧的操纵。而关于多表和年夜表中界说的游标(年夜的数据汇合)轮回很简单使程序进进一个冗长的守候乃至逝世机。
更主要的是,关于十分年夜的数据模子而言,分页检索时,假如依照传统的每次都加载全部数据源的办法长短常华侈资本的。如今盛行的分页办法通常为检索页面巨细的块区的数据,而非检索一切的数据,然后单步实行以后行。
思绪
从publish表中掏出第n条到第m条的纪录:
SELECTTOPm-n+1*
FROMpublish
WHERE(idNOTIN
(SELECTTOPn-1id
FROMpublish))
存储历程:
CREATEPROCEDUREpagination3
@tblNamevarchar(255),--表名
@strGetFieldsvarchar(1000)=*,--必要前往的列
@fldNamevarchar(255)=,--排序的字段名
@PageSizeint=10,--页尺寸
@PageIndexint=1,--页码
@doCountbit=0,--前往纪录总数,非0值则前往
@OrderTypebit=0,--设置排序范例,非0值则降序
@strWherevarchar(1500)=--查询前提(注重:不要加where)
AS
declare@strSQLvarchar(5000)--主语句
declare@strTmpvarchar(110)--一时变量
declare@strOrdervarchar(400)--排序范例
if@doCount!=0
begin
if@strWhere!=
set@strSQL=selectcount(*)Totalfromwhere+@strWhere
else
set@strSQL=selectcount(*)Totalfrom
end
--以上代码的意义是假如@doCount传送过去的不是0,就实行总数统计。以下的一切代码都是@doCount为0的情形:
else
begin
if@OrderType!=0
begin
set@strTmp=<(selectmin
set@strOrder=orderby[+@fldName+]desc
--假如@OrderType不是0,就实行降序,这句很主要!
end
else
begin
set@strTmp=>(selectmax
set@strOrder=orderby[+@fldName+]asc
end
if@PageIndex=1
begin
if@strWhere!=
set@strSQL=selecttop+str(@PageSize)++@strGetFields+from[+@tblName+]where+@strWhere++@strOrder
else
set@strSQL=selecttop+str(@PageSize)++@strGetFields+from[+@tblName+]+@strOrder
--假如是第一页就实行以上代码,如许会加速实行速率
end
else
begin
set@strSQL=selecttop+str(@PageSize)++@strGetFields+from[
+@tblName+]where[+@fldName+]+@strTmp+([
+@fldName+]) from(selecttop+str((@PageIndex-1)*@PageSize)+[
+@fldName+] from[+@tblName+]+@strOrder+)astblTmp)
+@strOrder
if@strWhere!=
set@strSQL=selecttop+str(@PageSize)++@strGetFields+from[
+@tblName+]where[+@fldName+]+@strTmp+([
+@fldName+])from(selecttop+str((@PageIndex-1)*@PageSize)+[
+@fldName+]from[+@tblName+]where+@strWhere+
+@strOrder+)astblTmp)and+@strWhere++@strOrder
end
end
exec(@strSQL)
--print@strSQL
GO
以上代码在winxp_sp2sqlserver2000personal下调试经由过程
我们分析上面的两个操作,都有一个“删除数据”的过程。 至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。 如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。 这是一个不错的新特性。虽然索引的附加字段没有索引键值效率高,但是相对映射到数据表中效率还是提高了很多。我做过试验,在我的实验环境中会比映射到表中提高30%左右的效率。 所以你总能得到相应的升级版本,来满足你的需求。 Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。 其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?! 但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
页:
[1]