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


当前回答

如果要省略系统数据库和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;

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

其他回答

执行:

从master.sys.databases中选择名称

这是目前首选的方法,而不是dbo。Sysdatabases,它已经被弃用一段时间了。


执行这个查询:

SELECT name FROM master.dbo.sysdatabases

或者如果你愿意

EXEC sp_databases

在SQL Server 7中,dbid 1 ~ dbid 4为系统dbs。

如果要省略系统数据库和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;

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

我使用下面的SQL Server Management Objects代码来获得一个数据库列表,这些数据库既不是系统数据库,也不是快照。

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();
}

排除系统数据库:

SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 6

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

更新准确的database_id,它应该大于4,跳过列表 数据库id在1到4之间的系统数据库。

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4