Home Forums SQL Server 2005 Administering Monitoring free space on mounted junction points? RE: Monitoring free space on mounted junction points?

  • Thanks for the script, it looks useful particularly the queries that return the growth settings. I'll use it when I need that information. Unfortunately, sys.dm_os_volume_stats doesn't exist in versions of SQL Server below 2008 and the script needs to run on both 2005 and 2008. The reason I need this script is to get readings of the database disk/file usage on all our servers. I've updated the script I had earlier and solved the problem with the error message I was getting by changing, under SSMS menu "Tools\Options\Query Results\SQL Server\Multiserver Results", the option of "Merge Results" to "False". This outputs a lot of rowsets and is a bit of a pain to paste into Excel but it achieves the result I need. Here's my updated script:

    DECLARE @ServerVersion varchar(100)

    SET @ServerVersion =CONVERT(varchar,SERVERPROPERTY('productversion'))

    SET @ServerVersion = LEFT(@ServerVersion, CHARINDEX('.',@ServerVersion)-1)

    --PRINT @ServerVersion

    DECLARE @command nvarchar(4000)

    IF CONVERT(int, @ServerVersion) < 10 --–2000, 2005

    BEGIN

    SET @command = '

    USE [?];

    IF OBJECT_ID(''tempdb..#xp_fixeddrives'') IS NOT NULL

    DROP TABLE #xp_fixeddrives;

    CREATE TABLE #xp_fixeddrives(Drive varchar(250), MBFree int);

    INSERT INTO #xp_fixeddrives

    EXEC master..xp_fixeddrives;

    SELECT CONVERT(varchar(250), SERVERPROPERTY(''ComputerNamePhysicalNetBIOS'')) COLLATE Latin1_General_CI_AS AS [CurrentHost],

    CONVERT(varchar(250), ISNULL(STUFF((SELECT '', '' + NodeName FROM fn_virtualservernodes() FOR XML PATH('''')), 1, 1, '''' ), '''')) COLLATE Latin1_General_CI_AS AS [CluserNodes],

    CONVERT(varchar(250), DB_NAME()) COLLATE Latin1_General_CI_AS [DB],

    CONVERT(varchar(250), df.type_desc) COLLATE Latin1_General_CI_AS [FileType],

    CONVERT(varchar(250), f.Name) COLLATE Latin1_General_CI_AS [Name],

    CONVERT(varchar(250), LEFT(f.FileName, 3)) COLLATE Latin1_General_CI_AS [VolumeOrDrive],

    CONVERT(varchar(250), f.FileName) COLLATE Latin1_General_CI_AS [FileName],

    CONVERT(Decimal(15,2), ROUND(f.Size/128.000, 2)) [File Size (MB)],

    CONVERT(Decimal(15,2), ROUND(FILEPROPERTY(f.Name,''SpaceUsed'')/128.000,2)) AS [Space Used In File (MB)],

    CONVERT(Decimal(15,2), ROUND((f.Size-FILEPROPERTY(f.Name,''SpaceUsed''))/128.000,2)) AS [Available Space In File (MB)],

    CONVERT(Decimal(15,2), d.MBFree) [Drive Free Space (MB)]

    FROM [?].dbo.sysfiles f WITH (NOLOCK)

    INNER JOIN [?].sys.database_files df ON df.file_id = f.fileid

    LEFT JOIN tempdb..#xp_fixeddrives d

    ON LEFT(f.FileName, 1) COLLATE Latin1_General_CI_AS = d.Drive COLLATE Latin1_General_CI_AS;'

    END

    ELSE -- SQL 2008+

    BEGIN

    SET @command = 'USE [?];

    SELECT CONVERT(varchar(250), SERVERPROPERTY(''ComputerNamePhysicalNetBIOS'')) COLLATE Latin1_General_CI_AS AS [CurrentHost],

    CONVERT(varchar(250), ISNULL(STUFF((SELECT '', '' + NodeName FROM fn_virtualservernodes() FOR XML PATH('''')), 1, 1, '''' ), ''Not Clustered'')) COLLATE Latin1_General_CI_AS AS [CluserNodes],

    CONVERT(varchar(250), DB_NAME(v.database_id)) COLLATE Latin1_General_CI_AS [DB],

    CONVERT(varchar(250), df.type_desc) COLLATE Latin1_General_CI_AS [FileType],

    CONVERT(varchar(250), f.name) COLLATE Latin1_General_CI_AS [Name],

    CONVERT(varchar(250), v.volume_mount_point) COLLATE Latin1_General_CI_AS [VolumeOrDrive],

    CONVERT(varchar(250), f.[Filename]) COLLATE Latin1_General_CI_AS [Filename],

    CONVERT(Decimal(15,2), ROUND(f.Size/128.000,2)) [File Size (MB)],

    CONVERT(Decimal(15,2), ROUND(FILEPROPERTY(f.Name,''SpaceUsed'')/128.000,2)) [Space Used In File (MB)],

    CONVERT(Decimal(15,2), ROUND((f.Size-FILEPROPERTY(f.Name,''SpaceUsed''))/128.000,2)) [Available Space In File (MB)],

    CONVERT(Decimal(15,2), v.available_bytes/1048576.0) AS [Drive Free Space (MB)]

    FROM [?].sys.sysfiles f WITH (NOLOCK)

    INNER JOIN [?].sys.database_files df ON df.file_id = f.fileid

    CROSS APPLY sys.dm_os_volume_stats(DB_ID(), f.fileid) v;'

    END

    -- END IF

    --PRINT @command

    EXEC sp_MSforeachdb @command

    Once it's in Excel it's easy to create multiple pivot tables and I can summaries the data to get all the information I need.