【发布时间】:2010-09-13 22:37:49
【问题描述】:
如何获取 SQL Server 实例上的可用数据库列表?我打算在 VB.NET 的组合框中列出它们。
【问题讨论】:
标签: sql-server
如何获取 SQL Server 实例上的可用数据库列表?我打算在 VB.NET 的组合框中列出它们。
【问题讨论】:
标签: sql-server
执行:
SELECT name FROM master.sys.databases
这是现在的首选方法,而不是 dbo.sysdatabases,后者已被弃用一段时间。
执行这个查询:
SELECT name FROM master.dbo.sysdatabases
或者如果你喜欢
EXEC sp_databases
【讨论】:
exec sp_databases 不起作用。另外两个(master.dbo.sysdatabases 和 sys.databases)仍然有效。
鉴于非用户数据库的数量不明确,您可能应该添加:
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
并添加报告服务数据库的名称
【讨论】:
排除系统数据库:
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
【讨论】:
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4
适用于我们的 SQL Server 2008
【讨论】:
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');
一些系统数据库名称是 (resource,distribution,reportservice,reportservicetempdb) 只需将其插入到查询中。 如果您的机器中默认有上述数据库。
【讨论】:
由于您使用的是 .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
【讨论】:
var SDBLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>().Where(bs => !bs.IsSystemObject && bs.ID>6).ToList();
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'
这适用于两种情况,无论是否启用报告
【讨论】:
我使用以下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();
}
【讨论】:
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
如果您想省略系统数据库和 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 条件。
【讨论】:
也许我是一只渡渡鸟!
show databases; 为我工作。
【讨论】:
在 SQL Server 7 中,dbid 1 到 4 是系统 dbs。
【讨论】:
不确定这是否会省略报告服务器数据库,因为我没有运行报告服务器数据库,但据我所知,我可以使用以下 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]
【讨论】:
如果您正在寻找一个命令来在 MYSQL 中列出数据库,那么只需使用以下命令。登录sql server后,
显示数据库;
【讨论】:
排除系统数据库:
SELECT name FROM master.dbo.sysdatabases where sid <>0x01
【讨论】:
sid 它在sys.databases 表上的列owner_sid