Câu trả lời:
Hành hình:
SELECT name FROM master.sys.databases
Đây là cách tiếp cận ưa thích bây giờ, hơn là dbo.sysdatabases
, đã bị phản đối trong một thời gian.
Thực hiện truy vấn này:
SELECT name FROM master.dbo.sysdatabases
hoặc nếu bạn thích
EXEC sp_databases
exec sp_databases
không hoạt động. Hai ( master.dbo.sysdatabases
và sys.databases
) khác vẫn hoạt động.
Để loại trừ cơ sở dữ liệu hệ thống:
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 6
Đã chỉnh sửa: 2:36 PM 2/5/2013
Được cập nhật với cơ sở dữ liệu chính xác, Nó phải lớn hơn 4, để bỏ qua cơ sở dữ liệu hệ thống liệt kê có id cơ sở dữ liệu từ 1 đến 4.
SELECT *
FROM sys.databases d
WHERE d.database_id > 4
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4
Hoạt động trên SQL Server 2008 của chúng tôi
ID
5 và 6 sẽ ReportServer
và ReportServerTempDB
nếu bạn đã SQL Server Reporting Services
cài đặt.
Vì bạn đang sử dụng .NET, bạn có thể sử dụng Đối tượng quản lý máy chủ SQL
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();
Đừng nhầm lẫn, Sử dụng truy vấn đơn giản dưới đây để có được tất cả các cơ sở dữ liệu,
select * from sys.databases
Nếu bạn chỉ cần cơ sở dữ liệu do người dùng xác định;
select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
Một số tên cơ sở dữ liệu hệ thống là (tài nguyên, phân phối, dịch vụ báo cáo, báo cáo báo cáo) chỉ cần chèn nó vào truy vấn. Nếu bạn có các db trên trong máy của bạn làm mặc định.
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'
Điều này sẽ hoạt động cho cả hai điều kiện, cho dù báo cáo có được bật hay không
Tôi sử dụng mã Đối tượng quản lý máy chủ SQL sau đây để nhận danh sách cơ sở dữ liệu không phải là cơ sở dữ liệu hệ thống và không phải là ảnh chụp nhanh.
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();
hoặc foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)
như trong .NET 4.0 + SQL Server 2014 hoặc .SqlServer.Smo \ 12.0.0.0
Nếu bạn muốn bỏ qua cơ sở dữ liệu hệ thống và bảng Báo cáo máy chủ (nếu được cài đặt):
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
Điều này hoạt động trên Sql Server 2008/2012/2014. Hầu hết các truy vấn đến từ thủ tục lưu trữ hệ thống " sp_database ". Tôi chỉ loại bỏ cột không cần thiết và thêm vào nơi có điều kiện.
Không chắc chắn nếu điều này sẽ bỏ qua cơ sở dữ liệu máy chủ Báo cáo vì tôi không chạy một cơ sở dữ liệu, nhưng từ những gì tôi đã thấy, tôi có thể bỏ qua cơ sở dữ liệu do người dùng hệ thống sở hữu với SQL này:
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]
có lẽ tôi là một con dodo!
show databases;
đã làm cho tôi.
Bạn có thể tìm thấy tất cả các tên cơ sở dữ liệu với điều này: -
select name from sys.sysdatabases
Để loại trừ cơ sở dữ liệu hệ thống:
SELECT name FROM master.dbo.sysdatabases where sid <>0x01
sid
cột nào trên sys.databases
bànowner_sid