Search

Wednesday, July 27, 2011

Code to get size, free space, cluster size and fragmentation on all disks

This code lists all disk on an sql serve box with information about size, % free space, cluster size, fragmentation etc. Have only been tested on sql 2005/2008

sp_configure 'show advanced options',1
reconfigure with override
go
sp_configure 'xp_cmdshell',1
reconfigure with override
go
use master
SET NOCOUNT ON
DECLARE @ReturnCode int
declare @TmpString varchar(100)
DECLARE @hr int
DECLARE @fso int
DECLARE @drive char(1)
DECLARE @odrive int
DECLARE @TotalSize varchar(20)
DECLARE @MB bigint ; SET @MB = 1048576


CREATE TABLE #drives (drive char(1) PRIMARY KEY,
FreeSpace int NULL,
TotalSize int NULL,
ClusterSize varchar(100),
Total_fragmentation varchar(100),
File_fragmentation varchar(100))

INSERT #drives(drive,FreeSpace)
EXEC master.dbo.xp_fixeddrives

EXEC @hr=sp_OACreate 'Scripting.FileSystemObject',@fso OUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @fso

DECLARE dcur CURSOR LOCAL FAST_FORWARD
FOR SELECT drive from #drives
ORDER by drive

OPEN dcur

FETCH NEXT FROM dcur INTO @drive

WHILE @@FETCH_STATUS=0
BEGIN

EXEC @hr = sp_OAMethod @fso,'GetDrive', @odrive OUT, @drive
IF @hr <> 0 EXEC sp_OAGetErrorInfo @fso

EXEC @hr = sp_OAGetProperty @odrive,'TotalSize', @TotalSize OUT
IF @hr <> 0 EXEC sp_OAGetErrorInfo @odrive

UPDATE #drives
SET TotalSize=@TotalSize/@MB
WHERE drive=@drive


CREATE TABLE #Messages(Message nvarchar(400))
set @TmpString = 'defrag '+@drive +':\ -a -v'
INSERT INTO #Messages
EXEC @ReturnCode = master..xp_cmdshell @TmpString
UPDATE #drives set ClusterSize =(select * from #Messages where message like'%cluster size%')where drive=@drive
UPDATE #drives set Total_fragmentation =(select * from #Messages where message like '%total fragmentation%') where drive=@drive
UPDATE #drives set file_fragmentation = (select top 1 message from #Messages where message like '%file fragmentation%') where drive=@drive
DROP TABLE #Messages


FETCH NEXT FROM dcur INTO @drive

END

CLOSE dcur
DEALLOCATE dcur

EXEC @hr=sp_OADestroy @fso
IF @hr <> 0 EXEC sp_OAGetErrorInfo @fso

SELECT drive,
FreeSpace as 'Free(MB)',
TotalSize as 'Total(MB)',
CAST((FreeSpace/(TotalSize*1.0))*100.0 as int) as 'Free(%)',
ClusterSize,Total_fragmentation,file_fragmentation

FROM #drives
ORDER BY drive

DROP TABLE #drives

No comments:

Post a Comment