none
还有别的更简单办法实现吗? RRS feed

  • 问题

  • 我想统计一下一个实例下的所有mdf文件的总计容量,这个办法似乎比较麻烦。

    我知道Windows命令行中有个for循环,能够逐一读取文件中的每一行作为变量;但我不知道在SQL SERVER中如何实现这点,可以使用array吗?

    USE master
    GO
    IF EXISTS(SELECT name FROM sys.objects WHERE object_id=object_id(N'[dbo].[abc]') AND type IN (N'U')) DROP TABLE master.dbo.abc;
    GO
    SELECT name,size*8/1024 AS SIZE into abc FROM sys.database_files  WHERE type_desc = 'RddddS' ;
    --创建一个表;
    GO
    DECLARE @sql VARCHAR(1000)
    SELECT @sql = 'use [?]; INSERT INTO master.dbo.abc SELECT name,size*8/1024 AS SIZE FROM sys.database_files  WHERE type_desc = "ROWS" ;'
    EXEC sp_msforeachdb @sql
    --保存数据到表中
    GO
    USE master
    SELECT SUM(size)/1024 AS '合计容量GB' FROM abc
    --统计总计容量,仅mdf部分
    GO
    2010年6月7日 9:11

答案

  • 一句话:


    select sum(size) from sys.master_files where type_desc='ROWS'

    在master库执行

    不过这个大小和实际大小有点点差别,你可以比较物理文件实际大小。


    family as water
    2010年6月7日 13:28

全部回复

  • 一句话:


    select sum(size) from sys.master_files where type_desc='ROWS'

    在master库执行

    不过这个大小和实际大小有点点差别,你可以比较物理文件实际大小。


    family as water
    2010年6月7日 13:28
  • 如果你的mdf文件指的是数据库主文件,或者系统中没有ndf,Stone Z的方法可以用。如果你指的是全部数据文件,包含ndf。那么只能用你的方法。

    cursor可以实现for循环,不过这个比sp_msforeachdb更麻烦。


    想不想时已是想,不如不想都不想。
    2010年6月8日 9:21
    版主
  • 如果你的mdf文件指的是数据库主文件,或者系统中没有ndf,Stone Z的方法可以用。如果你指的是全部数据文件,包含ndf。那么只能用你的方法。

    cursor可以实现for循环,不过这个比sp_msforeachdb更麻烦。


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

    公子,你在master数据库测试过我的sql么?ndf也可以查出来的。(我在sql 2005机器上测试通过)。


    family as water
    2010年6月9日 1:41
  • 你是对的,sys.master_files 里面有全部的数据库文件。抱歉误导了楼主。
    想不想时已是想,不如不想都不想。
    2010年6月9日 3:37
    版主