Mag*_*ier 4 sql-server sql-server-2008-r2 disk-space datafile compatibility-level
我需要一个将以下结果放在一起的查询:
到目前为止,我已经整理了以下查询:
SELECT
GETDATE() as dt
,@@SERVERNAME as srv
,F.name
,F.physical_name
,Round(F.size * 8 / 1024, 2) as FileSizeMb
, CAST(FILEPROPERTY(F.name, 'SpaceUsed') AS INT)/128 as FileUsedMB
,(F.size/128 - CAST(FILEPROPERTY(F.name, 'SpaceUsed') AS INT)/128) AS FileFreeMB
,Convert(decimal(18,2), (F.size/128 - CAST(FILEPROPERTY(F.name, 'SpaceUsed') AS INT)/128) / (F.size * 8 / 1024.1) * 100) as SpaceFreePerc
,stat.size_on_disk_bytes / 1024 / 1024 SizeOnDiskMb
,drv.volume_mount_point, drv.logical_volume_name, drv.available_bytes, drv.total_bytes
FROM sys.master_files F
inner join sys.dm_io_virtual_file_stats(NULL, NULL) stat on F.database_id = stat.database_id AND F.file_id = stat.file_id
CROSS APPLY sys.dm_os_volume_stats(F.database_id, F.FILE_ID) drv
Run Code Online (Sandbox Code Playgroud)
现在我在这里面临两个问题:
有没有办法在给定的条件下达到这个目标?解决方案不必是单语句查询,因为它最终将成为存储过程的一部分。
为了避免CROSS APPLY我能想到的最简单的方法是sys.dm_os_volume_stats使用显式参数调用database_idand file_id。这意味着为每个 db/file 组合执行单行结果。
首先,创建一个#temp 表来保存结果:
CREATE TABLE #x(dt datetime, srv nvarchar(520), logical_name sysname,
physical_name sysname, FileSizeMb int, FileUsedMB int, FileFreeMB int,
SpaceFreePerc decimal(18,2), SizeOnDiskMB int, volume_mount_point nvarchar(256),
logical_volume_name nvarchar(256), available_bytes bigint, total_bytes bigint);
Run Code Online (Sandbox Code Playgroud)
现在,一些变量和一个游标。这里唯一棘手的部分是@exec变量,它允许动态 SQL 的每次迭代都在正确的数据库上下文中执行。
DECLARE @database_id int, @file_id int, @logical_name sysname,
@physical_name nvarchar(520), @size int, @sql nvarchar(max), @exec sysname;
DECLARE c CURSOR LOCAL FAST_FORWARD
FOR SELECT database_id, [file_id], name, physical_name, size
FROM sys.master_files;
SET @sql = N'SELECT
GETDATE() as dt ,@@SERVERNAME as srv, @logical_name, @physical_name
,Round(@size * 8 / 1024, 2) as FileSizeMb
, CAST(FILEPROPERTY(@logical_name, N''SpaceUsed'') AS INT)/128 as FileUsedMB
,(@size/128 - CAST(FILEPROPERTY(@logical_name, N''SpaceUsed'') AS INT)/128) AS FileFreeMB
,Convert(decimal(18,2), (@size/128 - CAST(FILEPROPERTY(@logical_name, N''SpaceUsed'') AS INT)/128) / (@size * 8 / 1024.1) * 100) as SpaceFreePerc
,stat.size_on_disk_bytes / 1024 / 1024 SizeOnDiskMb
,drv.volume_mount_point, drv.logical_volume_name, drv.available_bytes, drv.total_bytes
FROM sys.master_files F
inner join sys.dm_io_virtual_file_stats(NULL, NULL) stat on F.database_id = stat.database_id AND F.file_id = stat.file_id
CROSS JOIN sys.dm_os_volume_stats(@database_id, @file_id) drv
WHERE F.database_id = @database_id AND F.file_id = @file_id;';
OPEN c;
FETCH NEXT FROM c INTO @database_id, @file_id, @logical_name, @physical_name, @size;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
SET @exec = DB_NAME(@database_id) + N'.sys.sp_executesql ';
INSERT #x EXEC @exec @sql, N'@database_id int, @file_id int,
@logical_name sysname, @physical_name nvarchar(520), @size int',
@database_id, @file_id, @logical_name, @physical_name, @size;
FETCH NEXT FROM c INTO @database_id, @file_id, @logical_name, @physical_name, @size;
END
SELECT * FROM #x;
CLOSE c; DEALLOCATE c;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |