Dapatkan daftar database dari SQL Server


381

Bagaimana saya bisa mendapatkan daftar database yang tersedia pada contoh SQL Server? Saya berencana untuk membuat daftar mereka di kotak kombo di VB.NET.

Jawaban:


614

Menjalankan:

SELECT name FROM master.sys.databases

Ini pendekatan yang disukai sekarang, daripada dbo.sysdatabases, yang telah ditinggalkan untuk beberapa waktu.


Jalankan permintaan ini:

SELECT name FROM master.dbo.sysdatabases

atau jika Anda suka

EXEC sp_databases

5
@ Gaia Itu memang ada sebagai tampilan kompatibilitas mundur. msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Chris Diver

4
EXEC sp_databases lambat dijalankan untuk saya; 40 detik pada instance dengan 36 database. Memilih dari sysdatabases adalah instan.
MarcE

10
Untuk memperluas apa yang dikatakan @ChrisDiver: SELECT name FROM sys.databases adalah pendekatan yang lebih disukai sekarang, daripada dbo.sysdatabases, yang telah ditinggalkan selama satu dekade sekarang.
Mikha

3
Setidaknya pada SQL Server 2014, exec sp_databasestidak berfungsi. Dua lainnya ( master.dbo.sysdatabasesdan sys.databases) masih berfungsi.
r2evans

86

mengingat ambiguitas jumlah database non-pengguna, Anda mungkin harus menambahkan:

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

dan tambahkan nama basis data layanan pelaporan


53

Untuk mengecualikan basis data sistem:

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

Diedit: 14:36 ​​2/5/2013

Diperbarui dengan database_id yang akurat, Ini harus lebih besar dari 4, untuk melewati daftar sistem database yang memiliki id database antara 1 dan 4.

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

7
Ini tidak bekerja. Mungkin maksudmu> 4? Tabel 5 & 6 adalah tabel pengguna.
Pengembang Outside the Box

1
Sepertinya harus selalu> 4, meskipun server yang saya periksa memiliki "ReportServer" dan "ReportServerTempDB" di posisi 5 dan 6.
Diputuskan

untuk saya> 6 akan Lakukan.
Robb_2015

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

Bekerja pada SQL Server 2008 kami


Database sistem dengan ID5 dan 6 akan ReportServerdan ReportServerTempDBjika Anda telah SQL Server Reporting Servicesmenginstal.
Charles Hepner

22

Karena Anda menggunakan .NET Anda dapat menggunakan Objek Manajemen 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

Saya ragu, itu (localhost), dibaca dari beberapa file konfigurasi. Saya tidak bisa membuatnya bekerja dengan "myhost" saya (yang merupakan nama host saya yang benar, katakan diperoleh oleh Environment.MachineName). Akankah ini bekerja jika saya mengganti "localhost" dengan "myhost"?
Ajeeb.KP

19

Jangan bingung, Gunakan kueri sederhana di bawah ini untuk mendapatkan semua basis data,

select * from sys.databases

Jika Anda hanya membutuhkan database yang ditentukan Pengguna;

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

Beberapa nama basis data Sistem adalah (sumber daya, distribusi, layanan laporan, reportervicetempdb) cukup masukkan ke dalam kueri. Jika Anda memiliki db di atas di mesin Anda sebagai default.


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

Ini akan berfungsi untuk kedua kondisi, Apakah pelaporan diaktifkan atau tidak


1
Hati-hati, jika server Anda adalah instance bernama, nama db ReportServer seperti ReportServer $ InstanceName dan ReportServer $ InstanceNameTempDB. Jadi ini, akan bekerja baik cara: PILIH [nama] DARI master.dbo.sysdatabases DI MANA dbid> 4 dan [nama] BUKAN SEPERTI 'ReportServer%'
ToddK

5

Saya menggunakan kode Objek Manajemen Server SQL berikut untuk mendapatkan daftar database yang bukan database sistem dan bukan snapshot.

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();atau foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)dalam. NET 4.0 + SQL Server 2014 atau .SqlServer.Smo \
12.0.0.0

2

Jika Anda ingin menghilangkan database sistem dan tabel ReportServer (jika diinstal):

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

Ini berfungsi pada Sql Server 2008/2012/2014. Sebagian besar kueri berasal dari prosedur tersimpan sistem " sp_databases ". Saya hanya menghapus kolom yang tidak dibutuhkan dan menambahkan kondisinya.


1

Dalam SQL Server 7, dbid 1 hingga 4 adalah sistem dbs.


1

Tidak yakin apakah ini akan menghilangkan database server Laporan karena saya tidak menjalankannya, tetapi dari apa yang saya lihat, saya bisa menghilangkan database milik pengguna sistem dengan SQL ini:

    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

mungkin saya seorang dodo!

show databases; bekerja untukku.


14
Tidak dalam SQL Server
Martin Smith

1
jawaban saya hanya membantu saya lagi. #blessed
thedanotto

perintah ini bekerja untuk saya juga, hasil lain bahkan yang dengan 528 suara tidak berfungsi.
Brano

-4

Dalam SQL Server 2008 R2 ini berfungsi:

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

Dan hanya daftar basis data yang dibuat oleh pengguna.


10
Sunting: Ini sangat salah! owner_sid=1berarti sapemilik, tidak ada yang istimewa tentang itu.
wqw

-4

Anda dapat menemukan semua nama basis data dengan ini: -

 select name from sys.sysdatabases

2
Tidak menambahkan apa pun atas jawaban yang diposting tahun sebelumnya
Martin Smith

-4

Untuk mengecualikan basis data sistem:

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

Ini mengecualikan sebagian besar basis data saya.
Jeff

Mengapa Anda menambahkan klausa di mana? Ini akan mengecualikan basis data sistem, OP tidak meminta ini. Dan lain kali jika Anda menambahkan jawaban, jelaskan apa yang dilakukan kueri. Dan di sebelahnya tidak ada sidkolomnya di atas sys.databasesmejaowner_sid
Jordy van Eijk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.