|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由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下调试经由过程
我们分析上面的两个操作,都有一个“删除数据”的过程。 |
|