none
SQL Server2008 R2如何查询数据库所在硬盘分区大小? RRS feed

  • 问题

  • 求各位大侠帮忙研究一下,小弟想做一个数据库占比:就是拿当前数据的大小/当前安装数据库的硬盘分区大小=占比

    当前数据大小,小弟已经找到方法:exec sp_spaceused

    但是不会查数据库那个分区的大小


    证明自己存在

    2012年7月9日 9:00

答案

  • exec master..xp_fixeddrives 
    exec master..xp_availablemedia 2
    exec xp_availablemedia 2
    
    --得到SQL中的各种目录   
    declare   @path   varchar(8000)   
        
    --得到当前数据库的数据文件路径   
    select   @path=rtrim(reverse(filename))   from   sysfiles   
    select   @path=reverse(substring(@path,charindex('\',@path),8000))   
    select   数据文件目录=@path   
        
    --得到SQL安装时设置的数据文件路径   
    select   @path=rtrim(reverse(filename))   from   master..sysfiles   where   name='master'   
    select   @path=reverse(substring(@path,charindex('\',@path),8000))   
    select   SQL数据文件目录=@path   
        
    --根据安装路径得到默认的备份目录:   
    select   @path=rtrim(reverse(filename))   from   master..sysfiles   where   name='master'   
    select   @path=substring(@path,charindex('\',@path)+1,8000),   
    @path=reverse(substring(@path,charindex('\',@path),8000))+'BACKUP\'   
    select   SQL默认备份目录=@path  

    更多相关内容,参考:

    http://topic.csdn.net/u/20080903/14/170e2386-793f-4be9-8214-e0d061e7c8da.html

    2012年7月9日 12:02
    版主

全部回复

  • sql server 中没有提供现成蚵用的,可以考虑自己写 CLR 函数,或者是通过 xp_cmdshell 调用 windows 的命令来获取

    2012年7月9日 11:43
  • exec master..xp_fixeddrives 
    exec master..xp_availablemedia 2
    exec xp_availablemedia 2
    
    --得到SQL中的各种目录   
    declare   @path   varchar(8000)   
        
    --得到当前数据库的数据文件路径   
    select   @path=rtrim(reverse(filename))   from   sysfiles   
    select   @path=reverse(substring(@path,charindex('\',@path),8000))   
    select   数据文件目录=@path   
        
    --得到SQL安装时设置的数据文件路径   
    select   @path=rtrim(reverse(filename))   from   master..sysfiles   where   name='master'   
    select   @path=reverse(substring(@path,charindex('\',@path),8000))   
    select   SQL数据文件目录=@path   
        
    --根据安装路径得到默认的备份目录:   
    select   @path=rtrim(reverse(filename))   from   master..sysfiles   where   name='master'   
    select   @path=substring(@path,charindex('\',@path)+1,8000),   
    @path=reverse(substring(@path,charindex('\',@path),8000))+'BACKUP\'   
    select   SQL默认备份目录=@path  

    更多相关内容,参考:

    http://topic.csdn.net/u/20080903/14/170e2386-793f-4be9-8214-e0d061e7c8da.html

    2012年7月9日 12:02
    版主
  • --指定数据库,直接select filename from <your_db_name>.dbo.sysfiles即可 GPOSDB是我机器的其中一个数据库在D盘
     declare @drivename char(1)
     select @drivename=left(filename,1) from GPOSDB.dbo.sysfiles where fileid=  1 --赋值所以没有结果网格显示
     SELECT 数据库所属驱动器=@drivename 
     
    if not exists(select 1 from tempdb.dbo.sysobjects where name like '#FreeSpace%' and type='U')
      create table #FreeSpace(
        Drive char(1),
        MB_Free int
        )
    else
          DROP  table #FreeSpace
    
    insert into #FreeSpace
    exec xp_fixeddrives
    
    select  MB_Free AS 数据库所属驱动器剩余空间 from #FreeSpace where Drive = @drivename
    
    

    注意:某个数据库的数据文件可能跨越两个及以上不同的物理磁盘;所以@drivename变量有可能得到不唯一的值。可以考虑用游标来实现

    给我写信: QQ我:点击这里给我发消息

    2012年7月10日 7:40

  • 给我写信: QQ我:点击这里给我发消息

    2012年7月10日 7:41
  • exec sp_spaceused

    是 8K 文件的数量数,不是大小

    Good Luck。

    2012年7月10日 9:07
  • 如果是SQL Server 2008 R2 SP1或更高版本的话,建议使用

    sys.dm_os_volume_stats (http://msdn.microsoft.com/zh-cn/library/hh223223(v=sql.105).aspx)

    因为原来的xp函数无法处理mount point的信息。


    想不想时已是想,不如不想都不想。

    2012年7月10日 15:49
    版主
  • 跨越两个及以上不同的物理磁盘的情况吗?

    给我写信: QQ我:点击这里给我发消息

    2012年7月10日 16:12