0

我的容量規劃過程非常困難,我通常用於SQL Server 2005及更高版本的DMV無法識別。DBO.SYSFILES不可用

我已經尋找腐敗,但數據庫是明確的。

,我通常運行的代碼如下:

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 

有沒有人有這樣的問題?

請分享任何知識

感謝和問候 馬塞洛

+1

沒有問題就在這裏 - 只是罰款。你可以嘗試使用'sys.sysfiles'(而不是'dbo.'),但這兩種方式都適用於我。我還會使用**更直觀的**表別名,比如'sys.sysfiles f'和'sys.database_files df'或類似的東西--' a'和'b'對於看着你的人來說並不是很清楚查詢... –

+0

也適用於此。 'dbo.sysfiles'和'sys.sysfiles'都許可問題。 – 2014-03-13 18:57:53

回答

0

我發現了什麼問題了。

對於該服務器中的所有其他數據庫,我使用名爲Latin1_General_CI_AS的排序規則。
對於我遇到錯誤的數據庫,我使用名爲SQL_Latin1_General_CP1_CI_AS的排序規則。

我剛剛把小寫字母的DMV名稱,它工作正常。

根據marc_s和Vladimir的建議,我已將dbo.sysfiles更改爲sys.sysfiles,但現在這兩種方式都可以正常工作。

感謝和問候
馬塞洛

1

嘗試使用sys.master_files表。第一個查詢將爲您提供SpaceUsed和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); 
    '