透明 发表于 2015-1-16 22:27:52

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

print

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)



print

/*

**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,来实现数据库的闪回。

小魔女 发表于 2015-1-19 13:28:47

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

愤怒的大鸟 发表于 2015-1-24 16:26:42

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);

分手快乐 发表于 2015-2-2 10:47:22

我们学到了什么?思考问题的时候从表的角度来思考问

飘飘悠悠 发表于 2015-2-7 18:14:04

相信各位对数据库和怎么样学习数据库都有一些经验和看法,也会有人走了一些弯路总结出自己的经验来,希望大家能把各自的看法和经验拿出来分享,给别人一份帮助,给自己一份快乐

深爱那片海 发表于 2015-2-22 21:45:46

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

小妖女 发表于 2015-3-7 03:31:26

XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)

灵魂腐蚀 发表于 2015-3-14 10:31:36

连做梦都在想页面结构是怎么样的,绝非虚言

再见西城 发表于 2015-3-21 03:40:15

微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
页: [1]
查看完整版本: MSSQL网页编程之有用的存储历程之一