Q9.1: sp_freedevice


use master go drop proc sp_freedevice go create proc sp_freedevice @devname char(30) = null as begin declare @showdev bit declare @alloc int if @devname = null select @devname = "%" , @showdev = 0 else select @showdev = 1 select @alloc = low from master.dbo.spt_values where type = "E" and number = 1 create table #freedev (name char(30), size float, used float) insert #freedev select dev.name, ((dev.high - dev.low) * @alloc + 500000) / 1048576, sum((usg.size * @alloc + 500000) / 1048576) from master.dbo.sysdevices dev, master.dbo.sysusages usg where dev.low <= usg.size + usg.vstart - 1 and dev.high >= usg.size + usg.vstart - 1 and dev.cntrltype = 0 group by dev.name insert #freedev select name, ((high - low) * @alloc + 500000) / 1048576, 0 from master.dbo.sysdevices where cntrltype = 0 and not exists (select * from #freedev where name = master.dbo.sysdevices.name) if @showdev = 1 begin select devname = dev.name, size = convert(varchar(10),f.size) + " MB", used = convert(varchar(10),f.used) + " MB", free = convert(varchar(10),f.size - f.used) + " MB" from master.dbo.sysdevices dev, #freedev f where dev.name = f.name and dev.name like @devname select dbase = db.name, size = convert(varchar(10),((usg.size * @alloc) + 500000) / 1048576) + " MB", usage = vl.name from master.dbo.sysdatabases db, master.dbo.sysusages usg, master.dbo.sysdevices dev, master.dbo.spt_values vl where db.dbid = usg.dbid and usg.segmap = vl.number and dev.low <= usg.size + usg.vstart - 1 and dev.high >= usg.size + usg.vstart - 1 and dev.status & 2 = 2 and vl.type = "S" and dev.name = @devname end else begin select total = convert(varchar(10), sum(size)) + " MB", used = convert(varchar(10), sum(used)) + " MB", free = convert(varchar(10), sum(size) - sum(used)) + " MB" from #freedev select devname = dev.name, size = convert(varchar(10),f.size) + " MB", used = convert(varchar(10),f.used) + " MB", free = convert(varchar(10),f.size - f.used) + " MB" from master.dbo.sysdevices dev, #freedev f where dev.name = f.name end end go grant execute on sp_freedevice to public go