查询数据库空间分配情况:
1 use master 2 go 3 create procedure dbo.proc_getdbspaceused 4 as 5 begin 6 set nocount on 7 create table #dbsize( 8 database_id int 9 ,database_name nvarchar(1024) 10 ,size_kb bigint 11 ,space_available_kb bigint 12 ,reserved_kb bigint 13 ,data_kb bigint 14 ,index_kb bigint 15 ,unused_kb bigint 16 ) 17 18 declare @database_id int 19 declare @name nvarchar(1024) 20 declare @sql nvarchar(max) 21 declare cur cursor for select database_id,name from master.sys.databases order by database_id 22 open cur 23 fetch next from cur into @database_id,@name 24 while @@fetch_status=0 25 begin 26 set @sql =N' 27 insert into #dbsize 28 select 29 database_id = '+CONVERT(nvarchar(10),@database_id)+', 30 database_name = '''+@name+''', 31 size_kb = ((dbsize + logsize) * 8192 / 1024), 32 space_available_kb = (case when dbsize >= reservedpages then ((dbsize-reservedpages)* 8192/ 1024) else 0 end), 33 reserved_kb = (reservedpages * 8192 / 1024), 34 data_kb = (pages * 8192.0 / 1024), 35 index_kb = ((usedpages - pages) * 8192 / 1024), 36 unused_kb = ((reservedpages - usedpages) * 8192 / 1024) 37 from( 38 select 39 dbsize = sum(convert(bigint,case when status & 64 = 0 then size else 0 end)) , 40 logsize = sum(convert(bigint,case when status & 64 <> 0 then size else 0 end)) 41 from ['+@name+'].dbo.sysfiles 42 ) t1,( 43 select 44 reservedpages = sum(a.total_pages), 45 usedpages = sum(a.used_pages), 46 pages = sum( 47 CASE 48 When it.internal_type IN (202,204,211,212,213,214,215,216) Then 0 49 When a.type <> 1 Then a.used_pages 50 When p.index_id < 2 Then a.data_pages Else 0 51 END ) 52 from ['+@name+'].sys.partitions p 53 inner join ['+@name+'].sys.allocation_units a on p.partition_id = a.container_id 54 left join ['+@name+'].sys.internal_tables it on p.object_id = it.object_id 55 )t2' 56 exec(@sql) 57 fetch next from cur into @database_id,@name 58 end 59 close cur 60 deallocate cur 61 62 select * from #dbsize 63 end 64 go