Das Skript ist ein nützliches Werkzeug zur Überwachung des Speicherplatzes von Datenbanken.:
DECLARE @ServerVersion varchar(100)
SET @ServerVersion = CONVERT(varchar, SERVERPROPERTY('productversion'))
SET @ServerVersion = LEFT(@ServerVersion, CHARINDEX('.', @ServerVersion, 4) - 1)
DECLARE @command nvarchar(2000)
DECLARE @dbname sysname
DECLARE @sql nvarchar(4000)
-- Temporäre Tabelle für die Ergebnisse
IF OBJECT_ID('tempdb..#FileData', 'U') IS NOT NULL
DROP TABLE tempdb..#FileData
CREATE TABLE tempdb..#FileData
(
[CurrentHost] varchar(250) COLLATE Latin1_General_CI_AS NULL,
[ClusterNodes] varchar(250) COLLATE Latin1_General_CI_AS NULL,
[DB] varchar(250) COLLATE Latin1_General_CI_AS NULL,
[FileType] varchar(250) COLLATE Latin1_General_CI_AS NULL,
[Name] varchar(250) COLLATE Latin1_General_CI_AS NULL,
[VolumeOrDrive] varchar(250) COLLATE Latin1_General_CI_AS NULL,
[FileName] varchar(250) COLLATE Latin1_General_CI_AS NULL,
[File Size (MB)] decimal(15,2) NULL,
[Space Used In File (MB)] decimal(15,2) NULL,
[Available Space In File (MB)] decimal(15,2) NULL,
[Drive Free Space (MB)] decimal(15,2) NULL
)
-- Vorbereitung des Befehlsgerüsts (ohne USE [?]) – je nach Version
IF CONVERT(float, @ServerVersion) < 10.5 -- SQL 2000, 2005, 2008
BEGIN
-- Temporäre Tabelle für xp_fixeddrives
IF OBJECT_ID('tempdb..#xp_fixeddrives', 'U') IS NOT NULL
DROP TABLE #xp_fixeddrives
CREATE TABLE #xp_fixeddrives (Drive varchar(250), MBFree int)
INSERT INTO #xp_fixeddrives EXEC master..xp_fixeddrives
SET @command = N'
INSERT INTO #FileData
(
[CurrentHost], [ClusterNodes], [DB], [FileType], [Name],
[VolumeOrDrive], [FileName], [File Size (MB)],
[Space Used In File (MB)], [Available Space In File (MB)],
[Drive Free Space (MB)]
)
SELECT
CONVERT(varchar(250), SERVERPROPERTY(''ComputerNamePhysicalNetBIOS'')) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), ISNULL(STUFF((SELECT '', '' + NodeName FROM fn_virtualservernodes() FOR XML PATH('''')), 1, 1, ''''), '''')) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), DB_NAME()) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), df.type_desc) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), f.Name) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), LEFT(f.FileName, 3)) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), f.FileName) COLLATE Latin1_General_CI_AS,
CONVERT(decimal(15,2), ROUND(f.Size / 128.000, 2)),
CONVERT(decimal(15,2), ROUND(FILEPROPERTY(f.Name, ''SpaceUsed'') / 128.000, 2)),
CONVERT(decimal(15,2), ROUND((f.Size - FILEPROPERTY(f.Name, ''SpaceUsed'')) / 128.000, 2)),
CONVERT(decimal(15,2), d.MBFree)
FROM dbo.sysfiles f WITH (NOLOCK)
INNER JOIN sys.database_files df ON df.file_id = f.fileid
LEFT JOIN #xp_fixeddrives d ON LEFT(f.FileName, 1) COLLATE Latin1_General_CI_AS = d.Drive COLLATE Latin1_General_CI_AS
'
END
ELSE -- SQL 2008R2+ (sys.dm_os_volume_stats verfügbar)
BEGIN
SET @command = N'
INSERT INTO #FileData
(
[CurrentHost], [ClusterNodes], [DB], [FileType], [Name],
[VolumeOrDrive], [FileName], [File Size (MB)],
[Space Used In File (MB)], [Available Space In File (MB)],
[Drive Free Space (MB)]
)
SELECT
CONVERT(varchar(250), SERVERPROPERTY(''ComputerNamePhysicalNetBIOS'')) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), ISNULL(STUFF((SELECT '', '' + NodeName FROM fn_virtualservernodes() FOR XML PATH('''')), 1, 1, ''''), '''')) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), DB_NAME(v.database_id)) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), df.type_desc) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), f.name) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), v.volume_mount_point) COLLATE Latin1_General_CI_AS,
CONVERT(varchar(250), f.[Filename]) COLLATE Latin1_General_CI_AS,
CONVERT(decimal(15,2), ROUND(f.Size / 128.000, 2)),
CONVERT(decimal(15,2), ROUND(FILEPROPERTY(f.Name, ''SpaceUsed'') / 128.000, 2)),
CONVERT(decimal(15,2), ROUND((f.Size - FILEPROPERTY(f.Name, ''SpaceUsed'')) / 128.000, 2)),
CONVERT(decimal(15,2), v.available_bytes / 1048576.0)
FROM sys.sysfiles f
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
-- Produktionssichere Schleife über alle Benutzerdatenbanken (sys.databases)
DECLARE db_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT name
FROM sys.databases
WHERE database_id > 4 -- Nur Benutzerdatenbanken, ggf. anpassen (z.B. auch > 0 für alle)
AND state = 0 -- Nur Online-Datenbanken
ORDER BY name
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
-- Dynamisches SQL im Kontext der aktuellen Datenbank ausführen
SET @sql = N'USE ' + QUOTENAME(@dbname) + N'; ' + @command
EXEC sp_executesql @sql
END TRY
BEGIN CATCH
-- Fehler protokollieren (z.B. PRINT) und mit nächster DB fortfahren
PRINT N'Fehler in Datenbank ' + QUOTENAME(@dbname) + N': ' + ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM db_cursor INTO @dbname
END
CLOSE db_cursor
DEALLOCATE db_cursor
-- Ergebnis anzeigen
SELECT * FROM #FileData
-- Aufräumen
DROP TABLE tempdb..#FileData
IF OBJECT_ID('tempdb..#xp_fixeddrives', 'U') IS NOT NULL
DROP TABLE #xp_fixeddrives