Nhận danh sách cơ sở dữ liệu từ SQL Server


381

Làm cách nào tôi có thể nhận được danh sách các cơ sở dữ liệu có sẵn trên phiên bản SQL Server? Tôi đang lên kế hoạch lập danh sách chúng trong hộp tổ hợp trong VB.NET.

Câu trả lời:


614

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

5
@Gia Nó tồn tại như một quan điểm tương thích ngược. msdn.microsoft.com/en-us/l Library / ms179900% 28v = MySQL.110% 29.aspx
Chris Diver

4
Cơ sở dữ liệu sp_dat của EXEC chậm thực thi đối với tôi; 40 giây trên một ví dụ với 36 cơ sở dữ liệu. Chọn từ cơ sở dữ liệu sysdat là ngay lập tức.
MarcE

10
Để mở rộng dựa trên những gì @ChrisDiver đã nói: CHỌN tên TỪ sys.database là cách tiếp cận ưa thích hiện nay, thay vì cơ sở dữ liệu dbo.sysdat, đã bị từ chối trong một thập kỷ nay.
Mi-chê

3
Ít nhất trên SQL Server 2014, exec sp_databaseskhông hoạt động. Hai ( master.dbo.sysdatabasessys.databases) khác vẫn hoạt động.
r2evans

86

trong bối cảnh mơ hồ về số lượng cơ sở dữ liệu không có người dùng, có lẽ bạn nên thêm:

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

và thêm tên của cơ sở dữ liệu dịch vụ báo cáo


53

Để 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

7
Điều này không hoạt động. Có lẽ bạn có nghĩa là> 4? Bảng 5 & 6 là bảng người dùng.
Nhà phát triển bên ngoài hộp

1
Có vẻ như nó phải luôn là> 4, mặc dù máy chủ mà tôi đang kiểm tra có "ReportServer" và "ReportServerTempDB" ở vị trí 5 và 6.
Đã xem

cho tôi> 6 sẽ làm.
Robb_2015

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

Hoạt động trên SQL Server 2008 của chúng tôi


Cơ sở dữ liệu hệ thống với ID5 và 6 sẽ ReportServerReportServerTempDBnếu bạn đã SQL Server Reporting Servicescài đặt.
Charles Hepner

22

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

Tôi nghi ngờ, nó (localhost), được đọc từ một số tập tin cấu hình. Tôi không thể làm cho nó hoạt động với "myhost" của tôi (tên máy chủ chính xác của tôi, được lấy bởi Môi trường.MachineName). Tôi sẽ làm việc này nếu tôi thay thế "localhost" bằng "myhost"?
Ajeeb.KP

19

Đừ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.


7
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


1
Cẩn thận, nếu máy chủ của bạn là một cá thể được đặt tên, các tên db của ReportServer giống như ReportServer $ InstanceName và ReportServer $ InstanceNameTempDB. Vì vậy, điều này sẽ hoạt động theo bất kỳ cách nào: CHỌN [tên] TỪ master.dbo.sysdatabase WHERE dbid> 4 và [name] KHÔNG THÍCH 'ReportServer%'
ToddK

5

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

một 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();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
Robb_2015

2

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.


1

Trong SQL Server 7, dbid 1 đến 4 là các dbs hệ thống.


1

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]

-1

có lẽ tôi là một con dodo!

show databases; đã làm cho tôi.


14
Không có trong Máy chủ SQL
Martin Smith

1
câu trả lời của tôi chỉ giúp tôi một lần nữa. #blred
thedanotto

lệnh này cũng có hiệu quả đối với tôi, kết quả khác ngay cả với 528 phiếu bầu cũng không hoạt động.
Brano

-4

Trong SQL Server 2008 R2, nó hoạt động:

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

Và chỉ liệt kê các cơ sở dữ liệu được tạo bởi người dùng.


10
Chỉnh sửa: Điều này là quá sai! owner_sid=1có nghĩa là sachủ sở hữu, không có gì đặc biệt về nó.
wqw

-4

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

2
Không thêm bất cứ điều gì qua các câu trả lời được đăng trước đó
Martin Smith

-4

Để loại trừ cơ sở dữ liệu hệ thống:

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

Điều này loại trừ hầu hết các cơ sở dữ liệu của tôi.
Jeff

Tại sao bạn thêm mệnh đề where? Điều này sẽ loại trừ cơ sở dữ liệu hệ thống, OP không yêu cầu điều này. Và lần sau nếu bạn thêm một câu trả lời giải thích những gì truy vấn làm. Và bên cạnh đó không có sidcột nào trên sys.databasesbànowner_sid
Jordy van Eijk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.