使用 SQL 查询确定可用磁盘大小

问题描述 投票:0回答:4

我需要确定数据库所在驱动器上的可用空间。 我了解

xp_fixeddrives
过程,但如何获取数据库所在的特定驱动器的信息?

sql sql-server sql-server-2005 disk diskspace
4个回答
13
投票

有这样的事吗?

declare @DatabaseName sysname 
set @DatabaseName = 'master'

declare @Drive table(DriveName char, FreeSpaceInMegabytes int)
insert @Drive execute xp_fixeddrives

select 
    mas.type_desc FileType, 
    mas.name FileName, 
    mas.physical_name PhysicalFileName, 
    mas.size * 8 / 1024 FileSizeInMegabytes,
    drv.DriveName, 
    drv.FreeSpaceInMegabytes
from sys.master_files mas
    left join @Drive drv on
        left(mas.physical_name, 1) = drv.DriveName
where database_id = db_id(@DatabaseName)

相应地设置

@DatabaseName


8
投票
    SELECT Drive
    ,   TotalSpaceGB
    ,   FreeSpaceGB
    ,   PctFree
    ,   PctFreeExact
    FROM
    (SELECT DISTINCT
        SUBSTRING(dovs.volume_mount_point, 1, 10) AS Drive
    ,   CONVERT(INT, dovs.total_bytes / 1024.0 / 1024.0 / 1024.0) AS TotalSpaceGB
    ,   CONVERT(INT, dovs.available_bytes / 1048576.0) / 1024 AS FreeSpaceGB
    ,   CAST(ROUND(( CONVERT(FLOAT, dovs.available_bytes / 1048576.0) / CONVERT(FLOAT, dovs.total_bytes / 1024.0 /
                         1024.0) * 100 ), 2) AS NVARCHAR(50)) + '%' AS PctFree
    ,   CONVERT(FLOAT, dovs.available_bytes / 1048576.0) / CONVERT(FLOAT, dovs.total_bytes / 1024.0 / 1024.0) * 100 AS PctFreeExact                
    FROM    sys.master_files AS mf
    CROSS APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) AS dovs) AS DE

2
投票

您还没有提到您的 SQL Server 版本。从 SQL Server 2005 开始,您可以从 sys.database_files 获取大量信息,并将其与 xp_fixeddrives 的输出相关联。


0
投票

假设您的数据库名称是 master 并且数据库的所有文件都位于同一卷上:

select available_bytes from sys.dm_os_volume_stats(DB_ID('master'), 1)

如果它们位于不同的驱动器上,请更改文件 ID(该函数的第二个参数)以获取另一个驱动器的空间。

sys.dm_os_volume_stats 还有一个 Total_bytes 列,这对于计算可用百分比可能很有用。

total_bytes 和 available_bytes 报告卷信息,因此如果所有文件都位于同一卷上,则只需要一次查询。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.