2008-09-29 159 views

回答

397

执行这个查询:

SELECT name FROM master.dbo.sysdatabases 

或者如果你喜欢

EXEC sp_databases 
+5

@Gia它确实存在作为一个向后compatablity视图。 http://msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx – 2011-08-07 22:26:04

+4

EXEC sp_databases是_slow_为我执行;具有36个数据库的实例需要40秒。从sysdatabases中选择是即时的。 – MarcE 2013-01-28 14:19:07

+6

要扩展@ChrisDiver所说的内容:SELECT name FROM sys.databases是现在的首选方法,而不是dbo.sysdatabases,现在已经废弃了十年。 – Micah 2016-02-03 19:36:38

46

要排除系统数据库:

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

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

准确database_id的更新,它应该比4更大,跳过上市,其是具有1和4

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

这不起作用。也许你的意思是> 4?表5和6是用户表。 – 2011-08-24 19:58:37

+1

它看起来应该总是> 4,尽管我正在检查的服务器在5和6位置有“ReportServer”和“ReportServerTempDB”。 – Trisped 2014-12-26 19:14:02

+0

对我来说> 6会做。 – 2015-12-20 07:27:56

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

作品我们的SQL Server 2008中

上之间的数据库ID 系统数据库
10

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

+0

仅当您(使用SQL安装程序愚蠢且安装了Reporting Services(而不是稍后不接受默认设置并使用管理器进行配置))或(使用预配置的INF文件安装并运行的SQL服务器) – 2013-10-04 14:42:05

68

的模糊性非用户数据库的数量来看,很可能需要添加:

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

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

2

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

-1

在SQL Server 2008 R2这个工程:

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

而仅列出数据库用户(一个或多个)创建的。

+0

尝试`owner_sid <> 1` – wqw 2012-09-21 13:13:52

+7

编辑:这是错的! `owner_sid = 1`意味着`sa`所有者,没什么特别的。 – wqw 2012-09-21 13:25:48

19

由于您使用.NET可以使用SQL Server Management Objects

Dim server As New Microsoft.SqlServer.Management.Smo.Server("localhost") 
For Each db As Database In server.Databases 
    Console.WriteLine(db.Name) 
Next 
5
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB' 

这两个条件下工作,无论报告已启用或不

3

我用下面的代码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(); 
} 
1

如果你想(如果已安装)省略系统数据库和表的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”系统存储过程。我只删除不需要的列,并添加了条件。

10

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

select * from sys.databases 

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

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

一些系统数据库名称(资源,分布,ReportService的,reportservicetempdb)只是将其插入查询。 如果你的机器中有上面的db作为默认值。

1

不知道,因为我没有运行一个,但是从我所看到的,这将省去报表服务器数据库,我可以省略系统用户所拥有的数据库具有以下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] 
-1

你可以找到所有数据库名称与此: -

select name from sys.sysdatabases 
2

也许我是一个渡渡鸟!

show databases;为我工作。

-1

要排除系统数据库:

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

可以使用。

select Name from sys.Databases 

它列出了所有存在的数据库。

在最新版本中测试至今(SQL Server 2017)。