DBO.SYSFILES不可用

时间:2014-03-13 16:28:16

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2

我的容量规划程序非常困难,我通常用于SQL Server 2005及更高版本的DMV无法识别。

我已经查找了腐败但数据库很清楚。

我通常运行的代码如下:

USE [MYDB];

SELECT 
    DatabaseName = DB_NAME() 
    ,a.FILEID 
    ,[FILE_SIZE_MB] = CONVERT(INT, ROUND(a.size / 128.000, 2)) 
    ,[SPACE_USED_MB] = CONVERT(INT, ROUND(FILEPROPERTY(a.NAME, 'SpaceUsed') / 128.000, 2)) 
    ,[FREE_SPACE_MB] = CONVERT(INT, ROUND((a.size - FILEPROPERTY(a.NAME, 'SpaceUsed')) /      128.000, 2)) 
    ,a.NAME AS [LOGICALNAME] 
    ,SUBSTRING(a.FILENAME,1,1) AS [DRIVE] 
    ,a.FILENAME 
    ,[FILE_TYPE] = b.type_desc 
FROM 
    DBO.SYSFILES a 
INNER JOIN 
    SYS.DATABASE_FILES b ON a.fileid = b.file_id 

有没有人有这样的问题?

请分享任何知识

感谢和问候 马塞洛

2 个答案:

答案 0 :(得分:1)

尝试使用sys.master_files表。第一个查询将为您提供除Space Used和FreeSpace之外的所有内容。第二个会给你一切。

SELECT DB_NAME([database_id]) AS [Database Name]
       ,[file_id]
       ,name AS [Logical Name]
       ,physical_name
       ,type_desc
       ,state_desc
       ,CONVERT(BIGINT, size / 128.0) AS [Total Size in MB]
       ,CONVERT(DECIMAL(18, 2), size / 131072.0) AS [Total Size in GB]
       ,CASE WHEN max_size = -1 THEN -1
             ELSE CONVERT(DECIMAL(18, 2), max_size / 131072.0)
        END AS [Max Size in GB]
    FROM sys.master_files WITH ( NOLOCK )
    WHERE [database_id] >4
    ORDER BY DB_NAME([database_id])
    OPTION ( RECOMPILE );

EXEC sys.sp_MSforeachdb 
'
use [?]
SELECT DB_NAME([database_id]) AS [Database Name]
       ,[file_id]
       ,name AS [Logical Name]
       ,physical_name
       ,type_desc
       ,state_desc
       ,CONVERT(BIGINT, size / 128.0) AS [Total Size in MB]
       ,CONVERT(BIGINT, FILEPROPERTY(NAME, ''SpaceUsed'') / 128.0) AS [Space Used in MB]
       ,CONVERT(BIGINT, size / 128.0) - CONVERT(BIGINT, FILEPROPERTY(NAME, ''SpaceUsed'') / 128.0) AS [Free Space in MB]
       ,CONVERT(DECIMAL(18, 2), size / 131072.0) AS [Total Size in GB]
       ,CASE WHEN max_size = -1 THEN -1
             ELSE CONVERT(DECIMAL(18, 2), max_size / 131072.0)
        END AS [Max Size in GB]
    FROM sys.master_files WITH ( NOLOCK )
    WHERE DB_NAME([database_id]) = ''?''
    ORDER BY DB_NAME([database_id])
    OPTION ( RECOMPILE );
    '

答案 1 :(得分:0)

我发现了问题所在。

对于该服务器中的所有其他数据库,我使用名为Latin1_General_CI_AS的排序规则。
对于我遇到错误的数据库,我使用名为SQL_Latin1_General_CP1_CI_AS的排序规则。

我刚刚将DMV的名称放在小写字母中,并且工作正常。

我已根据marc_s和Vladimir的建议将dbo.sysfiles更改为sys.sysfiles,但现在两种方式都可以正常工作。

感谢和问候 马塞洛