从SQL Server获取数据库列表

sef*_*sef 351 sql-server

如何获取SQL Server实例上的可用数据库列表?我打算在VB.NET的组合框中列出它们.

Ben*_*ein 567

执行:

SELECT name FROM master.sys.databases

这是现在的首选方法,而不是dbo.sysdatabases已经弃用了一段时间.


执行此查询:

SELECT name FROM master.dbo.sysdatabases
Run Code Online (Sandbox Code Playgroud)

或者如果你愿意的话

EXEC sp_databases
Run Code Online (Sandbox Code Playgroud)

  • 要扩展@ChrisDiver所说的内容:SELECT name FROM sys.databases是现在的首选方法,而不是dbo.sysdatabases,它现已被弃用了十年. (10认同)
  • @Gia它确实作为向后兼容性视图存在.http://msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx (5认同)
  • EXEC sp_databases是_slow_为我执行; 在具有36个数据库的实例上40秒.从sysdatabases中进行选择是即时的. (4认同)
  • 至少在SQL Server 2014上,`exec sp_databases`不起作用.另外两个(`master.dbo.sysdatabases`和`sys.databases`)仍然有效. (3认同)

Gil*_*lit 84

鉴于非用户数据库数量的模糊性,您应该添加:

WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
Run Code Online (Sandbox Code Playgroud)

并添加报告服务数据库的名称


Gil*_*ilM 52

要排除系统数据库:

SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 6
Run Code Online (Sandbox Code Playgroud)

编辑:2013年2月2日下午2:36

更新了准确的database_id,它应该大于4,以跳过列出数据库ID介于1和4之间的系统数据库.

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用.也许你的意思是> 4?表5和表6是用户表. (7认同)
  • 看起来它应该总是 > 4,尽管我正在检查的服务器在 5 和 6 位置有“ReportServer”和“ReportServerTempDB”。 (3认同)

小智 27

SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 
Run Code Online (Sandbox Code Playgroud)

适用于我们的SQL Server 2008


Chr*_*ver 22

由于您使用的是.NET,因此可以使用SQL Server管理对象

Dim server As New Microsoft.SqlServer.Management.Smo.Server("localhost")
For Each db As Database In server.Databases
    Console.WriteLine(db.Name)
Next
Run Code Online (Sandbox Code Playgroud)


Bal*_*aji 18

不要混淆,使用下面的简单查询来获取所有数据库,

select * from sys.databases
Run Code Online (Sandbox Code Playgroud)

如果你只需要用户定义的数据库;

select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb'); 
Run Code Online (Sandbox Code Playgroud)

一些系统数据库名称是(resource,distribution,reportservice,reportservicetempdb),只需将其插入查询即可.如果您的机器中有上述数据库作为默认值.


小智 7

SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'
Run Code Online (Sandbox Code Playgroud)

这将适用于两种情况,是否启用报告

  • 请注意,如果您的服务器是命名实例,则 ReportServer 数据库名称类似于 ReportServer$InstanceName 和 ReportServer$InstanceNameTempDB。因此,无论哪种方式都可以:SELECT [name] FROM master.dbo.sysdatabases WHERE dbid &gt; 4 and [name] NOT LIKE 'ReportServer%' (2认同)

Tar*_*ner 6

如果要省略系统数据库和 ReportServer 表(如果已安装)

select DATABASE_NAME = db_name(s_mf.database_id)
from sys.master_files s_mf
where
    s_mf.state = 0 -- ONLINE
    and has_dbaccess(db_name(s_mf.database_id)) = 1
    and db_name(s_mf.database_id) NOT IN ('master', 'tempdb', 'model', 'msdb')
    and db_name(s_mf.database_id) not like 'ReportServer%'
group by s_mf.database_id
order by 1;
Run Code Online (Sandbox Code Playgroud)

这适用于 SQL Server 2008/2012/2014。大多数查询来自“ sp_databases ”系统存储过程。我只删除了不需要的列并添加了 where 条件。


Rob*_*use 5

我使用下面的SQL Server管理对象代码来获取不是系统数据库也不是快照的数据库列表。

using Microsoft.SqlServer.Management.Smo;

public static string[] GetDatabaseNames( string serverName )
{
   var server = new Server( serverName );
   return ( from Database database in server.Databases 
            where !database.IsSystemObject && !database.IsDatabaseSnapshot
            select database.Name 
          ).ToArray();
}
Run Code Online (Sandbox Code Playgroud)