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.

sef
sumber

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
Ben Hoffstein
sumber
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

GilShalit
sumber
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
GilM
sumber
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

jujur
sumber
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
Chris Diver
sumber
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.

Balaji
sumber
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

ManiG
sumber
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();
}
Rob Prouse
sumber
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.

Tarık Özgün Güner
sumber
1

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

JerryOL
sumber
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]
watch_amajigger
sumber
-1

mungkin saya seorang dodo!

show databases; bekerja untukku.

mantra
sumber
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.

saper_2
sumber
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
david sam
sumber
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
Luca
sumber
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