MSSQL网页编程之有用的存储历程之一
闪回的目的是要让数据库在commit之后,还能恢复到之前的某个状态,整库或指定的表。存储历程有用的存储历程之一笔者事情的公司接纳的是SQLServer数据库,天天都要处置大批的数据,因为笔者进公司的工夫对照晚,公司现有的年夜部分的程序都是之前的程序员留下的,由于他们没有相干的文档,笔者关于背景数据库的良多表的布局和数据都不甚懂得,给一样平常的保护形成了很年夜的贫苦。
在对背景数据库举行研讨的过程当中,我必要失掉数据库的某些相干信息,好比,我但愿晓得各个用户表占用几磁盘空间,而且分列出来,可让我晓得哪些表对照年夜,数据对照多等等――我信任,这大概也是很多数据库办理员所体贴的成绩,以是我决计做一个通用的存储历程。我对体系的存储历程sp_spaceused加了一些修改,以合适我的请求。但愿这个存储历程能对人人有些匡助。存储历程以下:
ifexists(selectnamefromsysobjectswherename=spaceusedandtype=p)
Dropprocedurespaceused
GO
createprocedurespaceused
as
begin
declare@idint--Theobjectidof@objname.
declare@typecharacter(2)--Theobjecttype.
declare@pagesint--Workingvariableforsizecalc.
declare@dbnamesysname
declare@dbsizedec(15,0)
declare@logsizedec(15)
declare@bytesperpagedec(15,0)
declare@pagesperMBdec(15,0)
declare@objnamenvarchar(776)--Theobjectwewantsizeon.
declare@updateusagevarchar(5)--Param.forspecifyingthat
createtable#temp1
(
表名varchar(200)null,
行数char(11)null,
保存空间varchar(15)null,
数据利用空间varchar(15)null,
索引利用空间varchar(15)null,
未用空间varchar(15)null
)
--select@objname=N_dep--usageinfo.shouldbeupdated.
select@updateusage=false
/*CreatetemptablesbeforeanyDMLtoensuredynamic
**Weneedtocreateatemptabletodothecalculation.
**reserved:sum(reserved)whereindidin(0,1,255)
**data:sum(dpages)whereindid<2+sum(used)whereindid=255(text)
**indexp:sum(used)whereindidin(0,1,255)-data
**unused:sum(reserved)-sum(used)whereindidin(0,1,255)
*/
declarecur_tablecursorfor
selectnamefromsysobjectswheretype=u
Opencur_table
fetchnextfromcur_tableinto@objname
While@@FETCH_STATUS=0
begin
createtable#spt_space
(
rowsintnull,
reserveddec(15)null,
datadec(15)null,
indexpdec(15)null,
unuseddec(15)null
)
/*
**Checktoseeifuserwantsusagesupdated.
*/
if@updateusageisnotnull
begin
select@updateusage=lower(@updateusage)
if@updateusagenotin(true,false)
begin
raiserror(15143,-1,-1,@updateusage)
return(1)
end
end
/*
**Checktoseethattheobjnameislocal.
*/
if@objnameISNOTNULL
begin
select@dbname=parsename(@objname,3)
if@dbnameisnotnulland@dbnamedb_name()
begin
raiserror(15250,-1,-1)
return(1)
end
if@dbnameisnull
select@dbname=db_name()
/*
**Trytofindtheobject.
*/
select@id=null
select@id=id,@type=xtype
fromsysobjects
whereid=object_id(@objname)
/*
**Doestheobjectexist?
*/
if@idisnull
begin
raiserror(15009,-1,-1,@objname,@dbname)
return(1)
end
ifnotexists(select*fromsysindexes
where@id=idandindid<2)
if@typein(P,D,R,TR,C,RF)--datastoredinsysprocedures
begin
raiserror(15234,-1,-1)
return(1)
end
elseif@type=V--View=>nophysicaldatastorage.
begin
raiserror(15235,-1,-1)
return(1)
end
elseif@typein(PK,UQ)--nophysicaldatastorage.--?!?!toomanysimilarmessages
begin
raiserror(15064,-1,-1)
return(1)
end
elseif@type=F--FK=>nophysicaldatastorage.
begin
raiserror(15275,-1,-1)
return(1)
end
end
/*
**Updateusagesifuserspecifiedtodoso.
*/
if@updateusage=true
begin
if@objnameisnull
dbccupdateusage(0)withno_infomsgs
else
dbccupdateusage(0,@objname)withno_infomsgs
end
setnocounton
/*
**If@idisnull,thenwewantsummarydata.
*/
/*Spaceusedcalculatedinthefollowingway
**@dbsize=Pagesused
**@bytesperpage=d.low(whered=master.dbo.spt_values)is
**the#ofbytesperpagewhend.type=Eand
**d.number=1.
**Size=@dbsize*d.low/(1048576(OR1MB))
*/
if@idisnull
begin
select@dbsize=sum(convert(dec(15),size))
fromdbo.sysfiles
where(status&64=0)
select@logsize=sum(convert(dec(15),size))
fromdbo.sysfiles
where(status&640)
select@bytesperpage=low
frommaster.dbo.spt_values
wherenumber=1
andtype=E
select@pagesperMB=1048576/@bytesperpage
selectdatabase_name=db_name(),
database_size=
ltrim(str((@dbsize+@logsize)/@pagesperMB,15,2)+MB),
unallocatedspace=
ltrim(str((@dbsize-
(selectsum(convert(dec(15),reserved))
fromsysindexes
whereindidin(0,1,255)
))/@pagesperMB,15,2)+MB)
/*
**Nowcalculatethesummarydata.
**reserved:sum(reserved)whereindidin(0,1,255)
*/
insertinto#spt_space(reserved)
selectsum(convert(dec(15),reserved))
fromsysindexes
whereindidin(0,1,255)
/*
**data:sum(dpages)whereindid<2
**+sum(used)whereindid=255(text)
*/
select@pages=sum(convert(dec(15),dpages))
fromsysindexes
whereindid<2
select@pages=@pages+isnull(sum(convert(dec(15),used)),0)
fromsysindexes
whereindid=255
update#spt_space
setdata=@pages
/*index:sum(used)whereindidin(0,1,255)-data*/
update#spt_space
setindexp=(selectsum(convert(dec(15),used))
fromsysindexes
whereindidin(0,1,255))
-data
/*unused:sum(reserved)-sum(used)whereindidin(0,1,255)*/
update#spt_space
setunused=reserved
-(selectsum(convert(dec(15),used))
fromsysindexes
whereindidin(0,1,255))
selectreserved=ltrim(str(reserved*d.low/1024.,15,0)+
+KB),
data=ltrim(str(data*d.low/1024.,15,0)+
+KB),
index_size=ltrim(str(indexp*d.low/1024.,15,0)+
+KB),
unused=ltrim(str(unused*d.low/1024.,15,0)+
+KB)
from#spt_space,master.dbo.spt_valuesd
whered.number=1
andd.type=E
end
/*
**Wewantaparticularobject.
*/
else
begin
/*
**Nowcalculatethesummarydata.
**reserved:sum(reserved)whereindidin(0,1,255)
*/
insertinto#spt_space(reserved)
selectsum(reserved)
fromsysindexes
whereindidin(0,1,255)
andid=@id
/*
**data:sum(dpages)whereindid<2
**+sum(used)whereindid=255(text)
*/
select@pages=sum(dpages)
fromsysindexes
whereindid<2
andid=@id
select@pages=@pages+isnull(sum(used),0)
fromsysindexes
whereindid=255
andid=@id
update#spt_space
setdata=@pages
/*index:sum(used)whereindidin(0,1,255)-data*/
update#spt_space
setindexp=(selectsum(used)
fromsysindexes
whereindidin(0,1,255)
andid=@id)
-data
/*unused:sum(reserved)-sum(used)whereindidin(0,1,255)*/
update#spt_space
setunused=reserved
-(selectsum(used)
fromsysindexes
whereindidin(0,1,255)
andid=@id)
update#spt_space
setrows=i.rows
fromsysindexesi
wherei.indid<2
andi.id=@id
insertinto#temp1
selectname=object_name(@id),
rows=convert(char(11),rows),
reserved=ltrim(str(reserved*d.low/1024.,15,0)+
+KB),
data=ltrim(str(data*d.low/1024.,15,0)+
+KB),
index_size=ltrim(str(indexp*d.low/1024.,15,0)+
+KB),
unused=ltrim(str(unused*d.low/1024.,15,0)+
+KB)
from#spt_space,master.dbo.spt_valuesd
whered.number=1
andd.type=E
Droptable#spt_space
end
fetchnextfromcur_tableinto@objname
end
Closecur_table
DEALLOCATEcur_table
Select*from#temp1orderbylen(保存空间)desc,保存空间desc
Droptable#temp1
return(0)
end
道理很复杂,信任人人都能看懂,sp_spaceused几近一成不变地保存上去,挪用也很复杂,间接实行便可,没有任何参数,存储历程实行后,将把以后毗连的数据库中一切数据表依照从年夜到小分列出来,另有其他的相干信息。假如能对人人有所参考代价,就请人人能给forgot2000一点掌声勉励吧,感谢!
本存储历程在SQLServer7.0/2000下经由过程。
自己QQ:33563255,E-mail:coolforgot@sina.com
目前的方案是用mysqlbinlog工具,增加一个flashback参数,输出结果为一个新的binlog文件――姑且叫做flashbacklog,这个flashbacklog顺序执行,可制定某张表和执行到哪个pos,来实现数据库的闪回。 一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。 另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程); 我们学到了什么?思考问题的时候从表的角度来思考问 相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐 SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。 XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!) 连做梦都在想页面结构是怎么样的,绝非虚言 微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
页:
[1]