• Ofer Gal (5/11/2011)


    This gives me the log space used.

    I need the data space used or unused

    Oops. Here is a query (sql2k compatible) that I use regularly for that.

    SET NOCOUNT ON;

    Declare

    @TargetDatabase sysname,

    @Level varchar(10),

    @UpdateUsage bit,

    @Unit char(2)

    Select @TargetDatabase = NULL,-- NULL: all dbs

    @Level = 'File',-- or "Database"

    @UpdateUsage = 0,-- default no update

    @Unit = 'GB'-- Megabytes, Kilobytes or Gigabytes

    CREATE TABLE #Tbl_CombinedInfo (

    DatabaseName sysname NULL,

    [type] VARCHAR(10) NULL,

    FileGroup VARCHAR(50) NULL,

    LogicalName VARCHAR(150) NULL,

    T dec(10, 2) NULL,

    U dec(10, 2) NULL,

    [U(%)] dec(5, 2) NULL,

    F dec(10, 2) NULL,

    [F(%)] dec(5, 2) NULL,

    PhysicalName sysname NULL );

    CREATE TABLE #Tbl_DbFileStats (

    Id int identity,

    DatabaseName sysname NULL,

    FileId int NULL,

    FileGroupID int NULL,

    TotalExtents bigint NULL,

    UsedExtents bigint NULL,

    Name sysname NULL,

    [FileName] varchar(255) NULL );

    CREATE TABLE #Tbl_ValidDbs (

    Id int identity,

    Dbname sysname NULL );

    CREATE TABLE #Tbl_Logs (

    DatabaseName sysname NULL,

    LogSize dec (10, 2) NULL,

    LogSpaceUsedPercent dec (5, 2) NULL,

    Status int NULL );

    DECLARE @Ver varchar(10),

    @DatabaseName sysname,

    @Ident_last int,

    @String varchar(2000),

    @BaseString varchar(2000);

    SELECT @DatabaseName = '',

    @Ident_last = 0,

    @String = '',

    @Ver = CASE WHEN @@VERSION LIKE '%9.0%' THEN 'SQL 2005'

    WHEN @@VERSION LIKE '%8.0%' THEN 'SQL 2000'

    WHEN @@VERSION LIKE '%10.%' THEN 'SQL 2008'

    END;

    SELECT @BaseString = ' SELECT DB_NAME(), ' +

    CASE WHEN @Ver = 'SQL 2000' THEN 'CASE WHEN a.status & 0x40 = 0x40 THEN ''Log'' ELSE ''Data'' END'

    ELSE 'CASE type WHEN 0 THEN ''Data'' WHEN 1 THEN ''Log'' WHEN 4 THEN ''Full-text'' ELSE ''reserved'' END'

    END

    + ', groupname, name, ' +

    CASE WHEN @Ver = 'SQL 2000' THEN 'filename'

    ELSE 'physical_name'

    END

    + ', size*8.0/1024.0 FROM ' +

    CASE WHEN @Ver = 'SQL 2000' THEN 'sysfiles a Left Join sysfilegroups b on a.groupid = b.groupid'

    ELSE 'sys.database_files a Left Join sysfilegroups b on a.data_space_id = b.groupid'

    END

    + ' WHERE ' +

    CASE WHEN @Ver = 'SQL 2000' THEN ' HAS_DBACCESS(DB_NAME()) = 1'

    ELSE 'state_desc = ''ONLINE'''

    END

    + '';

    SELECT @String = 'INSERT INTO #Tbl_ValidDbs SELECT name FROM ' +

    CASE WHEN @Ver = 'SQL 2000' THEN 'master.dbo.sysdatabases'

    WHEN @Ver IN ('SQL 2005', 'SQL 2008') THEN 'master.sys.databases'

    END

    + ' WHERE HAS_DBACCESS(name) = 1 ORDER BY name ASC';

    EXEC (@String);

    INSERT INTO #Tbl_Logs EXEC ('DBCC SQLPERF (LOGSPACE) WITH NO_INFOMSGS');

    BEGIN

    WHILE 1 = 1

    BEGIN

    SELECT TOP 1 @DatabaseName = Dbname

    FROM #Tbl_ValidDbs

    WHERE Dbname > @DatabaseName

    ORDER BY Dbname;

    IF @@ROWCOUNT = 0

    BREAK;

    SELECT @Ident_last = ISNULL(MAX(Id), 0)

    FROM #Tbl_DbFileStats;

    SELECT @String = 'INSERT INTO #Tbl_CombinedInfo (DatabaseName, type, FileGroup, LogicalName, PhysicalName, T) ' + @BaseString;

    EXEC ('USE [' + @DatabaseName + '] ' + @String);

    INSERT INTO #Tbl_DbFileStats (FileId, FileGroupID, TotalExtents, UsedExtents, Name, FileName)

    EXEC ('USE [' + @DatabaseName + '] DBCC SHOWFILESTATS WITH NO_INFOMSGS');

    UPDATE #Tbl_DbFileStats

    SET DatabaseName = @DatabaseName

    WHERE Id BETWEEN @Ident_last + 1

    AND @@IDENTITY;

    END

    END

    UPDATE #Tbl_CombinedInfo

    SET U = s.UsedExtents*8*8/1024.0

    FROM #Tbl_CombinedInfo t

    JOIN #Tbl_DbFileStats s ON t.LogicalName = s.Name

    AND s.DatabaseName = t.DatabaseName;

    UPDATE #Tbl_CombinedInfo

    SET [U(%)] = LogSpaceUsedPercent,

    U = T * LogSpaceUsedPercent/100.0

    FROM #Tbl_CombinedInfo t

    JOIN #Tbl_Logs l ON l.DatabaseName = t.DatabaseName

    WHERE t.type = 'Log';

    UPDATE #Tbl_CombinedInfo SET F = T - U, [U(%)] = U*100.0/T;

    UPDATE #Tbl_CombinedInfo SET [F(%)] = F*100.0/T;

    IF UPPER(ISNULL(@Level, 'DATABASE')) = 'FILE'

    BEGIN

    IF @Unit = 'KB'

    UPDATE #Tbl_CombinedInfo

    SET T = T * 1024, U = U * 1024, F = F * 1024;

    IF @Unit = 'GB'

    UPDATE #Tbl_CombinedInfo

    SET T = T / 1024, U = U / 1024, F = F / 1024;

    SELECT Case When CAST(SERVERPROPERTY('InstanceName') as varchar(50)) is NULL

    Then CAST(SERVERPROPERTY('MachineName') as varchar(50))

    Else CAST(SERVERPROPERTY('InstanceName') as varchar(50))

    End as 'InstanceName',

    DatabaseName AS 'Database',

    type AS 'Type',

    FileGroup,

    LogicalName,

    T AS 'Total',

    U AS 'Used',

    [U(%)] AS 'Used (%)',

    F AS 'Free',

    [F(%)] AS 'Free (%)',

    PhysicalName

    FROM #Tbl_CombinedInfo

    WHERE DatabaseName LIKE ISNULL(@TargetDatabase, '%')

    ORDER BY DatabaseName, type;

    END

    DROP TABLE #Tbl_CombinedInfo

    DROP TABLE #Tbl_DbFileStats

    DROP TABLE #Tbl_ValidDbs

    DROP TABLE #Tbl_Logs

    There is an exception to every rule, except this one...