从SQL Server获取数据库列表


381

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

Answers:


614

执行:

SELECT name FROM master.sys.databases

现在,这是首选方法,而不是dbo.sysdatabases已被淘汰了一段时间的。


执行此查询:

SELECT name FROM master.dbo.sysdatabases

或者如果您愿意

EXEC sp_databases


4
EXEC sp_databases 对我来说执行起来很。具有36个数据库的实例需要40秒。立即从sysdatabases中进行选择。
MarcE 2013年

10
为了进一步扩展@ChrisDiver所说的内容:从sys.databases中选择名称是现在的首选方法,而不是dbo.sysdatabases,后者已经被弃用了十年。
米卡

3
至少在SQL Server 2014上exec sp_databases不起作用。其他两个(master.dbo.sysdatabasessys.databases)仍然有效。
r2evans

86

鉴于关于非用户数据库的数量的歧义,您可能应该添加:

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

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


53

要排除系统数据库:

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

编辑时间:2013年2月5日2:36 PM

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

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

7
这是行不通的。也许您的意思是> 4?表5和6是用户表。
盒子外面的开发商

1
尽管我正在检查的服务器在5和6位置上都有“ ReportServer”和“ ReportServerTempDB”,但看起来它应该总是> 4。
2014年

对我来说> 6就可以了。
Robb_2015

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

适用于我们的SQL Server 2008


如果已安装,则系统数据库为ID5和6 。ReportServerReportServerTempDBSQL Server Reporting Services
Charles Hepner 2011年

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

var SDBLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>().Where(bs => !bs.IsSystemObject && bs.ID>6).ToList();
Robb_2015

我怀疑它(本地主机)是从某些配置文件中读取的。我无法将其与我的“ myhost”(这是我的正确主机名,例如由Environment.MachineName获取)一起使用。如果将“ localhost”替换为“ myhost”,是否可以使用?
Ajeeb.KP,2016年

19

请勿混淆,请使用以下简单查询获取所有数据库,

select * from sys.databases

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

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

只是将某些系统数据库名称(资源,分发,reportservice,reportservicetempdb)插入查询中。如果您的计算机上默认有上述数据库。


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

无论是否启用报告,这对两种情况都适用


1
小心,如果您的服务器是命名实例,则ReportServer数据库名称类似于ReportServer $ InstanceName和ReportServer $ InstanceNameTempDB。因此,无论哪种方式都可以工作:从master.dbo.sysdatabases那里选择[name] dbid> 4,并且[name]不喜欢'ReportServer%'
ToddK

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

oneliner:var DBsLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>().Where(bs => !bs.IsSystemObject && bs.ID>6).ToList();foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)如.NET 4.0 + SQL Server 2014或.SqlServer.Smo \ 12.0.0.0
Robb_2015 2015年

2

如果要省略系统数据库和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 ”系统存储过程。我只删除不需要的列,并在其中添加条件。



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

也许我是渡渡鸟!

show databases; 为我工作。


14
不在SQL Server中
Martin Smith,

1
我的回答再次帮助了我。#blessed
thedanotto

这个命令也对我有用,其他结果,即使是528票的结果也不起作用。
布拉诺

-4

在SQL Server 2008 R2中,该方法有效:

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

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


10
编辑:这太错了!owner_sid=1表示sa所有者,没什么特别的。
wqw 2012年

-4

您可以使用以下命令找到所有数据库名称:

 select name from sys.sysdatabases

2
在几年前发布的答案中没有添加任何内容
马丁·史密斯

-4

要排除系统数据库:

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

这排除了我的大部分数据库。
杰夫

为什么要添加where子句?这将排除系统数据库,OP不会要求这样做。下次如果您添加答案,请说明查询的作用。旁边没有桌子的一sidsys.databasesowner_sid
Jordy van Eijk,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.