从SQL Server获取数据库列表

时间:2008-09-29 05:50:14

标签: sql-server

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

15 个答案:

答案 0 :(得分:524)

执行:

SELECT name FROM master.sys.databases

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


执行此查询:

SELECT name FROM master.dbo.sysdatabases

或者如果您愿意

EXEC sp_databases

答案 1 :(得分:77)

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

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

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

答案 2 :(得分:48)

排除系统数据库:

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

答案 3 :(得分:26)

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

适用于我们的SQL Server 2008

答案 4 :(得分:20)

由于您使用的是.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 :(得分:15)

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

select * from sys.databases

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

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

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

答案 6 :(得分:5)

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

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

答案 7 :(得分: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();
}

答案 8 :(得分:1)

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

答案 9 :(得分: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。大多数查询来自&#34; sp_databases &#34;系统存储过程。我只删除不需要的列并添加条件。

答案 10 :(得分: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]

答案 11 :(得分:-3)

也许我是渡渡鸟!

EPH为我工作。

答案 12 :(得分:-4)

在SQL Server 2008 R2中,这可以工作:

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

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

答案 13 :(得分:-4)

排除系统数据库:

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

答案 14 :(得分:-5)

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

 select name from sys.sysdatabases