MS SQL: List All Databases and File Sizes

Modified on Mon, 22 Sep at 4:43 PM

-- Create a temp table to store results
CREATE TABLE #DatabaseFileSizes (
    DatabaseName NVARCHAR(128),
    LogicalFileName NVARCHAR(128),
    FileType NVARCHAR(60),
    PhysicalFilePath NVARCHAR(260),
    TotalSizeMB DECIMAL(18,2),
    UsedSpaceMB DECIMAL(18,2),
    FreeSpaceMB DECIMAL(18,2)
);

-- Cursor to loop through databases
DECLARE @DatabaseName NVARCHAR(128);
DECLARE @SQL NVARCHAR(MAX);

DECLARE db_cursor CURSOR FOR
SELECT name FROM sys.databases
WHERE state_desc = 'ONLINE' AND name NOT IN ('master', 'tempdb', 'model', 'msdb');

OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @DatabaseName;

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @SQL = '
    USE [' + @DatabaseName + '];
    INSERT INTO #DatabaseFileSizes
    SELECT
        DB_NAME() AS DatabaseName,
        mf.name AS LogicalFileName,
        mf.type_desc AS FileType,
        mf.physical_name AS PhysicalFilePath,
        CAST(mf.size * 8.0 / 1024 AS DECIMAL(18,2)) AS TotalSizeMB,
        CAST(FILEPROPERTY(mf.name, ''SpaceUsed'') * 8.0 / 1024 AS DECIMAL(18,2)) AS UsedSpaceMB,
        CAST((mf.size - FILEPROPERTY(mf.name, ''SpaceUsed'')) * 8.0 / 1024 AS DECIMAL(18,2)) AS FreeSpaceMB
    FROM sys.database_files mf;
    ';
    EXEC sp_executesql @SQL;
    FETCH NEXT FROM db_cursor INTO @DatabaseName;
END

CLOSE db_cursor;
DEALLOCATE db_cursor;

-- Final result
SELECT * FROM #DatabaseFileSizes ORDER BY DatabaseName, FileType;

-- Clean up
DROP TABLE #DatabaseFileSizes;

Was this article helpful?

That’s Great!

Thank you for your feedback

Sorry! We couldn't be helpful

Thank you for your feedback

Let us know how can we improve this article!

Select at least one of the reasons
CAPTCHA verification is required.

Feedback sent

We appreciate your effort and will try to fix the article