您的位置:首页 > 数据库

查看数据库表的数据量和SIZE大小的脚本修正

2016-05-12 14:31 211 查看
在使用桦仔的分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)的脚本时,遇到下面一些错误



这个是因为这些表的Schema是Maint,而不是默认的dbo,造成下面这段SQL在执行EXECsp_spaceused@tablename时出现Msg15009,Level16,State1,Proceduresp_spaceused,Line75Theobject'xxxx'doesnotexistindatabase'YourSQLDba'orisinvalidforthisoperation.

DECLAREInfo_cursorCURSOR
FOR
SELECT'['+[name]+']'
FROMsys.tables
WHEREtype='U';
OPENInfo_cursor
FETCHNEXTFROMInfo_cursorINTO@tablename
WHILE@@FETCH_STATUS=0
BEGIN
INSERTINTO#tablespaceinfo
EXECsp_spaceused@tablename
FETCHNEXTFROMInfo_cursor
INTO@tablename
END


修正后的脚本如下所示

CREATETABLE#tablespaceinfo
(
nameinfoVARCHAR(500),
rowsinfoBIGINT,
reservedVARCHAR(20),
datainfoVARCHAR(20),
index_sizeVARCHAR(20),
unusedVARCHAR(20)
)
DECLARE@tablenameVARCHAR(255);
DECLAREInfo_cursorCURSOR
FOR
SELECT'['+s.[name]+']'+'.'+'['+t.[name]+']'
FROMsys.tablest
INNERJOINsys.schemassONt.schema_id=s.schema_id
WHEREtype='U';
OPENInfo_cursor
FETCHNEXTFROMInfo_cursorINTO@tablename
WHILE@@FETCH_STATUS=0
BEGIN
INSERTINTO#tablespaceinfo
EXECsp_spaceused@tablename
FETCHNEXTFROMInfo_cursor
INTO@tablename
END
CLOSEInfo_cursor
DEALLOCATEInfo_cursor
--创建临时表
CREATETABLE[#tmptb]
(
TableNameVARCHAR(50),
DataInfoBIGINT,
RowsInfoBIGINT,
SpaceperrowAS(CASERowsInfo
WHEN0THEN0
ELSECAST(DataInfoASdecimal(18,2))/CAST(RowsInfoASdecimal(18,2))
END)PERSISTED
)
--插入数据到临时表
INSERTINTO[#tmptb]
([TableName],
[DataInfo],
[RowsInfo]
)
SELECT[nameinfo],
CAST(REPLACE([datainfo],'KB','')ASBIGINT)AS'datainfo',
[rowsinfo]
FROM#tablespaceinfo
ORDERBYCAST(REPLACE(reserved,'KB','')ASINT)DESC
--汇总记录
SELECT[tbspinfo].*,
[tmptb].[Spaceperrow]AS'每行记录大概占用空间(KB)'
FROM[#tablespaceinfo]AStbspinfo,
[#tmptb]AStmptb
WHERE[tbspinfo].[nameinfo]=[tmptb].[TableName]
ORDERBYCAST(REPLACE([tbspinfo].[reserved],'KB','')ASINT)DESC
DROPTABLE[#tablespaceinfo]
DROPTABLE[#tmptb]

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: