【转载】sp_spaceused2,看库里全部表占用的物理空间

我常用sp_spaceused来查看表所占的空间大小,可是一次只能看一个对象的。
今天有空写了个sp_spaceused2,可以同时看全部表的空间大小。
use master
go
EXEC sp_addmessage @msgnum = 55000@severity = 16
   
@msgtext = N'Objects of type %s do not have space allocated.'
   
@lang = 'us_english',@replace = 'replace'

EXEC sp_addmessage @msgnum = 55000@severity = 16
   
@msgtext = N'没有为类型 %1! 的对象分配的空间。'
   
@lang = '简体中文',@replace = 'replace'
go
if exists (select 1 from sysobjects where name = 'sp_spaceused2' and type = 'P')
 
drop procedure sp_spaceused2
go
create procedure sp_spaceused2 (
 
@type varchar(2= 'U'-- The objects type we want size on.
 @updateusage varchar(5= false -- Param. for specifying that
     -- usage info. should be updated.
)
as
create table #spt_space
(
 id  
int not null primary key,
 name  sysname,
 rows  
int null,
 reserved 
dec(15null,
 data  
dec(15null,
 indexp  
dec(15null,
 unused  
dec(15null
)

--  Check the object type.
if @type not in ('U','S'-- no physical data storage.
  begin
   
raiserror(55000,-1,-1,@type)
   
return (1)
  
end

--  Check to see if user wants usages updated.

if @updateusage is not null
 
begin
  
select @updateusage=lower(@updateusage)

  
if @updateusage not in ('true','false')
   
begin
    
raiserror(15143,-1,-1,@updateusage)
    
return(1)
   
end
 
end

if @updateusage = 'true'
 
begin
  
dbcc updateusage(0with no_infomsgs
  
print ' '
 
end

set nocount on
--id, name, rows
insert into #spt_space (id, name, rows, data)
select i.id, o.name, i.rows, 0
from sysindexes i inner join sysobjects o on i.id = o.id 
where i.indid < 2 and o.type = @type

--reserved
update #spt_space
set reserved = r.reserved
from ( select o.id, sum(i.reserved) as reserved from sysindexes i inner join sysobjects o on i.id = o.id 
 
where i.indid in (01255and o.type = @type group by o.id) r
where #spt_space.id = r.id

--data
update #spt_space
set data = data + r.pages
from ( select o.id, isnull(sum(i.dpages),0as pages from sysindexes i inner join sysobjects o on i.id = o.id 
 
where i.indid < 2 and o.type = @type group by o.id) r
where #spt_space.id = r.id

update #spt_space
set data = data + r.used
from ( select o.id, isnull(sum(used), 0as used from sysindexes i inner join sysobjects o on i.id = o.id 
 
where i.indid = 255 and o.type = @type group by o.id) r
where #spt_space.id = r.id


--index page
update #spt_space
set indexp = r.used - data
from ( select o.id, sum(convert(dec(15),used)) as used from sysindexes i inner join sysobjects o on i.id = o.id 
 
where i.indid in (01255and o.type = @type group by o.id) r
where #spt_space.id = r.id

--unused page
update #spt_space
set unused = reserved - r.used
from ( select o.id, sum(convert(dec(15),used)) as used from sysindexes i inner join sysobjects o on i.id = o.id 
 
where i.indid in (01255and o.type = @type group by o.id) r
where #spt_space.id = r.id

--output
 select #spt_space.name,
  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_values d
  
where d.number = 1
   
and d.type = 'E'

return 0
go


sp_MS_marksystemobject 
'sp_spaceused2'

go
use [dbname]
exec sp_spaceused2
出处:http://blog.myspace.cn/1300316663/archive/2007/05/23/249582259.aspx
原文地址:https://www.cnblogs.com/yukaizhao/p/sp_spaceused2.html