Listing information about all database files in SQL Server

后端 未结 13 2268
遥遥无期
遥遥无期 2021-02-01 00:08

Is it possible to list information about the files (MDF/LDF) of all databases on an SQL Server?

I\'d like to get a list showing which database is using what files on th

13条回答
  •  滥情空心
    2021-02-01 00:40

    This script lists most of what you are looking for and can hopefully be modified to you needs. Note that it is creating a permanent table in there - you might want to change it. It is a subset from a larger script that also summarises backup and job information on various servers.

    IF OBJECT_ID('tempdb..#DriveInfo') IS NOT NULL
     DROP TABLE #DriveInfo
    CREATE TABLE #DriveInfo
     (
        Drive CHAR(1)
        ,MBFree INT
     ) 
    
    INSERT  INTO #DriveInfo
          EXEC master..xp_fixeddrives
    
    
    IF OBJECT_ID('[dbo].[Tmp_tblDatabaseInfo]', 'U') IS NOT NULL 
       DROP TABLE [dbo].[Tmp_tblDatabaseInfo]
    CREATE TABLE [dbo].[Tmp_tblDatabaseInfo](
          [ServerName] [nvarchar](128) NULL
          ,[DBName] [nvarchar](128)  NULL
          ,[database_id] [int] NULL
          ,[create_date] datetime NULL
          ,[CompatibilityLevel] [int] NULL
          ,[collation_name] [nvarchar](128) NULL
          ,[state_desc] [nvarchar](60) NULL
          ,[recovery_model_desc] [nvarchar](60) NULL
          ,[DataFileLocations] [nvarchar](4000)
          ,[DataFilesMB] money null
          ,DataVolumeFreeSpaceMB INT NULL
          ,[LogFileLocations] [nvarchar](4000)
          ,[LogFilesMB] money null
          ,LogVolumeFreeSpaceMB INT NULL
    
    ) ON [PRIMARY]
    
    INSERT INTO [dbo].[Tmp_tblDatabaseInfo] 
    SELECT 
          @@SERVERNAME AS [ServerName] 
          ,d.name AS DBName 
          ,d.database_id
          ,d.create_date
          ,d.compatibility_level  
          ,CAST(d.collation_name AS [nvarchar](128)) AS collation_name
          ,d.[state_desc]
          ,d.recovery_model_desc
          ,(select physical_name + ' | ' AS [text()]
             from sys.master_files m
             WHERE m.type = 0 and m.database_id = d.database_id
             ORDER BY file_id
             FOR XML PATH ('')) AS DataFileLocations
          ,(select sum(size) from sys.master_files m WHERE m.type = 0 and m.database_id = d.database_id)  AS DataFilesMB
          ,NULL
          ,(select physical_name + ' | ' AS [text()]
             from sys.master_files m
             WHERE m.type = 1 and m.database_id = d.database_id
             ORDER BY file_id
             FOR XML PATH ('')) AS LogFileLocations
          ,(select sum(size) from sys.master_files m WHERE m.type = 1 and m.database_id = d.database_id)  AS LogFilesMB
          ,NULL
    FROM  sys.databases d  
    
    WHERE d.database_id > 4 --Exclude basic system databases
    UPDATE [dbo].[Tmp_tblDatabaseInfo] 
       SET DataFileLocations = 
          CASE WHEN LEN(DataFileLocations) > 4 THEN  LEFT(DataFileLocations,LEN(DataFileLocations)-2) ELSE NULL END
       ,LogFileLocations =
          CASE WHEN LEN(LogFileLocations) > 4 THEN  LEFT(LogFileLocations,LEN(LogFileLocations)-2) ELSE NULL END
       ,DataFilesMB = 
          CASE WHEN DataFilesMB > 0 THEN  DataFilesMB * 8 / 1024.0   ELSE NULL END
       ,LogFilesMB = 
          CASE WHEN LogFilesMB > 0 THEN  LogFilesMB * 8 / 1024.0  ELSE NULL END
       ,DataVolumeFreeSpaceMB = 
          (SELECT MBFree FROM #DriveInfo WHERE Drive = LEFT( DataFileLocations,1))
       ,LogVolumeFreeSpaceMB = 
          (SELECT MBFree FROM #DriveInfo WHERE Drive = LEFT( LogFileLocations,1))
    
    select * from [dbo].[Tmp_tblDatabaseInfo] 
    

提交回复
热议问题