列出有关SQL Server中所有数据库文件的信息

M4N*_*M4N 82 t-sql sql-server database-management sql-server-2008

是否可以列出有关SQL Server上所有数据库的文件(MDF/LDF)的信息?

我想得到一个列表,显示哪个数据库正在使用本地磁盘上的文件.

我尝试了什么:

  • exec sp_databases 所有数据库
  • select * from sys.databases 显示了有关每个数据库的大量信息 - 但不幸的是,它没有显示每个数据库使用的文件.
  • select * from sys.database_files显示master数据库的mdf/ldf文件- 但不显示其他数据库

Mik*_*son 114

您可以使用sys.master_files.

包含存储在master数据库中的每个数据库文件的行.这是一个单一的系统范围视图.

  • 谢谢,(与sys.databases一起加入)是我想要的! (4认同)
  • @M4N 如果您只想获取数据库名称,您也可以调用`DB_NAME(database_id)` 而不是加入`sys.databases` (3认同)
  • 从 sys.master_files 中选择 * (2认同)

Meh*_*nas 74

如果要获取数据库的位置,可以选中" 获取所有数据库位置".
您可以使用sys.master_files获取db的位置并sys.databse获取数据库名称

SELECT
    db.name AS DBName,
    type_desc AS FileType,
    Physical_Name AS Location
FROM
    sys.master_files mf
INNER JOIN 
    sys.databases db ON db.database_id = mf.database_id
Run Code Online (Sandbox Code Playgroud)


Jān*_*nis 16

我使用脚本在每个文件中获取空白空间:

Create Table ##temp
(
    DatabaseName sysname,
    Name sysname,
    physical_name nvarchar(500),
    size decimal (18,2),
    FreeSpace decimal (18,2)
)   
Exec sp_msforeachdb '
Use [?];
Insert Into ##temp (DatabaseName, Name, physical_name, Size, FreeSpace)
    Select DB_NAME() AS [DatabaseName], Name,  physical_name,
    Cast(Cast(Round(cast(size as decimal) * 8.0/1024.0,2) as decimal(18,2)) as nvarchar) Size,
    Cast(Cast(Round(cast(size as decimal) * 8.0/1024.0,2) as decimal(18,2)) -
        Cast(FILEPROPERTY(name, ''SpaceUsed'') * 8.0/1024.0 as decimal(18,2)) as nvarchar) As FreeSpace
    From sys.database_files
'
Select * From ##temp
drop table ##temp
Run Code Online (Sandbox Code Playgroud)

大小以KB表示.


Ale*_*ite 6

我创建了这个查询:

SELECT 
    db.name AS                                   [Database Name], 
    mf.name AS                                   [Logical Name], 
    mf.type_desc AS                              [File Type], 
    mf.physical_name AS                          [Path], 
    CAST(
        (mf.Size * 8
        ) / 1024.0 AS DECIMAL(18, 1)) AS         [Initial Size (MB)], 
    'By '+IIF(
            mf.is_percent_growth = 1, CAST(mf.growth AS VARCHAR(10))+'%', CONVERT(VARCHAR(30), CAST(
        (mf.growth * 8
        ) / 1024.0 AS DECIMAL(18, 1)))+' MB') AS [Autogrowth], 
    IIF(mf.max_size = 0, 'No growth is allowed', IIF(mf.max_size = -1, 'Unlimited', CAST(
        (
                CAST(mf.max_size AS BIGINT) * 8
        ) / 1024 AS VARCHAR(30))+' MB')) AS      [MaximumSize]
FROM 
     sys.master_files AS mf
     INNER JOIN sys.databases AS db ON
            db.database_id = mf.database_id
Run Code Online (Sandbox Code Playgroud)