从SQL Server获取数据库列表

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

执行这个查询:

SELECT name FROM master.dbo.sysdatabases 

或者如果你喜欢

 EXEC sp_databases 

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

 WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb'); 

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

要排除系统数据库:

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

编辑:下午2:36 2/5/2013

用精确的database_id更新,应该大于4,以略过列出数据库ID在1到4之间的系统数据库。

 SELECT * FROM sys.databases d WHERE d.database_id > 4 
 SELECT [name] FROM master.dbo.sysdatabases WHERE dbid > 4 

适用于我们的SQL Server 2008

由于您正在使用.NET,因此您可以使用SQL Serverpipe理对象

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

如果您安装了SQL Server Reporting Services,则ID为5和6的系统数据库将为ReportServer和ReportServerTempDB。

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

 select * from sys.databases 

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

 select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb'); 

一些系统数据库名称是(资源,分发,reportservice,reportservicetempdb)只是插入到查询中。 如果你有默认的机器上面的数据库。

 SELECT [name] FROM master.dbo.sysdatabases WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB' 

这将适用于条件,是否启用报告

我使用以下SQL Serverpipe理对象代码来获取不是系统数据库而不是快照的数据库列表。

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

在SQL Server 7中,dbid 1到4是系统dbs。

也许我是个傻瓜!

show databases; 为我工作。

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

 select DATABASE_NAME = db_name(s_mf.database_id) from sys.master_files s_mf where s_mf.state = 0 and -- ONLINE 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 ”系统存储过程。 我只删除不需要的列,并添加条件。

不知道这是否会省略报表服务器数据库,因为我没有运行一个,但从我所看到的,我可以用这个SQL省略系统用户拥有的数据库:

  SELECT db.[name] as dbname FROM [master].[sys].[databases] db LEFT OUTER JOIN [master].[sys].[sysusers] su on su.sid = db.owner_sid WHERE su.sid is null order by db.[name] 

在SQL Server 2008 R2中,这起作用:

 select name from master.sys.databases where owner_sid > 1; 

并仅列出由用户创build的数据库。

你可以find所有的数据库名称:

  select name from sys.sysdatabases 

要排除系统数据库:

 SELECT name FROM master.dbo.sysdatabases where sid <>0x01