Get All SQL SERVER Database Information with multiple file groups using sys.databases and sys.master_files

Here is a quick script to find ALL databases on a server with size and file locations and a little more.  If multiple file groups exist it will put them in a pipe delimited format in the datafile or log file locations  

Example: Query Information From All Databases On A SQL Server Instance
-- Get database information, file locations and sizes
-- xp_fixeddrives may need to be commented out in some environments
-- comment out lines as needed 
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
-------------------------------------------------------------
-- Drop #Tmp_tblDatabaseInfo table if it exists
IF OBJECT_ID('tempdb..#Tmp_tblDatabaseInfo'IS NOT NULL
 DROP TABLE #Tmp_tblDatabaseInfo

-- Create #Tmp_tblDatabaseInfo table for population
CREATE TABLE #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
      ,[Last backup] [nvarchar](4000)
      ,[DataFiles] [INT] NULL
      ,[DataFileLocations] [nvarchar](4000)
      ,[DataFilesMB] money null
      ,DataVolumeFreeSpaceMB INT NULL
      ,[LogFiles] [INT] NULL
      ,[LogFileLocations] [nvarchar](4000)
      ,[LogFilesMB] money null
      ,LogVolumeFreeSpaceMB INT NULLON [PRIMARY]


-- Populate data info from sys.master_files and sys.databases and msdb..backupset
INSERT INTO #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,
            ISNULL((SELECT TOP 1
CASE TYPE WHEN 'D' THEN 'Full' WHEN 'I' THEN 'Differential' WHEN 'L' THEN 'Transaction log' END + ' – ' +
LTRIM(ISNULL(STR(ABS(DATEDIFF(DAYGETDATE(),Backup_finish_date))) + ' days ago''NEVER')) + ' – ' +
CONVERT(VARCHAR(20), backup_start_date, 103) + ' ' + CONVERT(VARCHAR(20), backup_start_date, 108) + ' – ' +
CONVERT(VARCHAR(20), backup_finish_date, 103) + ' ' + CONVERT(VARCHAR(20), backup_finish_date, 108) +
' (' + CAST(DATEDIFF(second, BK.backup_start_date,
BK.backup_finish_date) AS VARCHAR(4)) + ' '
'seconds)'
FROM msdb..backupset BK WHERE BK.database_name = d.name ORDER BY backup_set_id DESC),'-'AS [Last backup]
      ,(select count(1) from sys.master_files m WHERE m.type = 0 and m.database_id = d.database_id)  AS DataFiles
      ,(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(sizefrom sys.master_files m WHERE m.type = 0 and m.database_id = d.database_id)  AS DataFilesMB
      ,NULL
      ,(select count(1) from sys.master_files m WHERE m.type = 1 and m.database_id = d.database_id)  AS LogFiles
      ,(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(sizefrom 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 system databases as needed

UPDATE #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 / 128.0   ELSE NULL END
   ,LogFilesMB =  CASE WHEN LogFilesMB > 0 THEN  LogFilesMB / 128.0  ELSE NULL END
-- *** EXEC master..xp_fixeddrives not used for DriveInfo comment out the below two lines 
   ,DataVolumeFreeSpaceMB = (SELECT MBFree FROM #DriveInfo WHERE Drive = LEFT( DataFileLocations,1))
   ,LogVolumeFreeSpaceMB =  (SELECT MBFree FROM #DriveInfo WHERE Drive = LEFT( LogFileLocations,1))
-- *** EXEC master..xp_fixeddrives not used for DriveInfo comment out the below two lines 

-- Review the populated table
select * from #Tmp_tblDatabaseInfo
You can alternately omit the drive free space or include the system databases as needed.





Comments

Popular posts from this blog

How to mass update all or some sql server agent job step commands

SQL Monitoring for Blocking and Locking Capture and Log to table with sp_WhoIsActive or sp_BlitzWho

SQL Server General Index Naming Convention