Liste der Datenbanken von SQL Server abrufen

381

Wie kann ich die Liste der verfügbaren Datenbanken auf einer SQL Server-Instanz abrufen? Ich plane, eine Liste von ihnen in einem Kombinationsfeld in VB.NET zu erstellen.

sef
quelle

Antworten:

614

Ausführen:

SELECT name FROM master.sys.databases

Dies ist jetzt der bevorzugte Ansatz und nicht dbo.sysdatabasesder seit einiger Zeit veraltete.


Führen Sie diese Abfrage aus:

SELECT name FROM master.dbo.sysdatabases

oder wenn Sie es vorziehen

EXEC sp_databases
Ben Hoffstein
quelle
5
@Gia Es existiert als Abwärtskompatibilitätsansicht. msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Chris Diver
4
EXEC sp_databases wurde für mich nur langsam ausgeführt. 40 Sekunden auf einer Instanz mit 36 ​​Datenbanken. Die Auswahl aus Sysdatabases erfolgte sofort.
MarcE
10
Um das zu erweitern, was @ChrisDiver gesagt hat: SELECT name FROM sys.databases ist jetzt der bevorzugte Ansatz anstelle von dbo.sysdatabases, das seit einem Jahrzehnt veraltet ist.
Micah
3
Zumindest unter SQL Server 2014 hat exec sp_databasesdas nicht funktioniert. Die anderen beiden ( master.dbo.sysdatabasesund sys.databases) funktionieren noch.
R2evans
86

Angesichts der Unklarheit hinsichtlich der Anzahl der Nichtbenutzerdatenbanken sollten Sie wahrscheinlich hinzufügen:

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

und fügen Sie die Namen der Reporting Services-Datenbanken hinzu

GilShalit
quelle
53

So schließen Sie Systemdatenbanken aus:

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

Bearbeitet: 14:36 ​​05.02.2013

Mit der genauen Datenbank-ID aktualisiert. Es sollte größer als 4 sein, um die Auflistung von Systemdatenbanken mit einer Datenbank-ID zwischen 1 und 4 zu überspringen.

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4
GilM
quelle
7
Das funktioniert nicht. Vielleicht meintest du> 4? Die Tabellen 5 und 6 sind Benutzertabellen.
Außerhalb der Box Entwickler
1
Es sieht so aus, als ob es immer> 4 sein sollte, obwohl der Server, den ich überprüfe, "ReportServer" und "ReportServerTempDB" an den Positionen 5 und 6 hat.
Trisped
für mich würde> 6 tun.
Robb_2015
27
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 

Funktioniert auf unserem SQL Server 2008

Frank
quelle
Systemdatenbanken mit ID5 und 6 werden ReportServerund ReportServerTempDBwenn Sie SQL Server Reporting Servicesinstalliert haben.
Charles Hepner
22

Da Sie .NET verwenden, können Sie die SQL Server-Verwaltungsobjekte verwenden

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
quelle
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
Ich bezweifle, dass es (localhost) aus einer Konfigurationsdatei gelesen wird. Ich konnte es mit meinem "myhost" (der mein korrekter Hostname ist, beispielsweise von Environment.MachineName erhalten) nicht zum Laufen bringen. Wird dies funktionieren, wenn ich "localhost" durch "myhost" ersetze?
Ajeeb.KP
19

Seien Sie nicht verwirrt. Verwenden Sie die folgende einfache Abfrage, um alle Datenbanken abzurufen.

select * from sys.databases

Wenn Sie nur die benutzerdefinierten Datenbanken benötigen;

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

Einige der Systemdatenbanknamen (Ressource, Verteilung, Berichtsservice, Berichtsservicetempdb) fügen Sie sie einfach in die Abfrage ein. Wenn Sie die oben genannten Datenbanken standardmäßig in Ihrem Computer haben.

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

Dies funktioniert für beide Bedingungen, unabhängig davon, ob die Berichterstellung aktiviert ist oder nicht

ManiG
quelle
1
Wenn Ihr Server eine benannte Instanz ist, sind die ReportServer-Datenbanknamen wie ReportServer $ InstanceName und ReportServer $ InstanceNameTempDB. Das würde also so oder so funktionieren: SELECT [name] FROM master.dbo.sysdatabases WHERE dbid> 4 und [name] NOT LIKE 'ReportServer%'
ToddK
5

Ich verwende den folgenden Code für SQL Server-Verwaltungsobjekte , um eine Liste von Datenbanken abzurufen, die keine Systemdatenbanken und keine Snapshots sind.

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

Wenn Sie Systemdatenbanken und ReportServer-Tabellen weglassen möchten (falls installiert):

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

Dies funktioniert auf SQL Server 2008/2012/2014. Der größte Teil der Abfrage stammt aus der gespeicherten Systemprozedur " sp_databases ". Ich entferne nur nicht benötigte Spalten und füge wo Bedingungen hinzu.

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

In SQL Server 7 sind dbid 1 bis 4 die System-dbs.

JerryOL
quelle
1

Ich bin nicht sicher, ob dadurch die Berichtsserver-Datenbanken weggelassen werden, da ich keine ausführe, aber nach dem, was ich gesehen habe, kann ich systembenutzereigene Datenbanken mit dieser SQL weglassen:

    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
quelle
-1

Vielleicht bin ich ein Dodo!

show databases; arbeitete für mich.

thedanotto
quelle
14
Nicht in SQL Server
Martin Smith
1
Meine Antwort hat mir einfach wieder geholfen. # gesegnet
Thedanotto
Dieser Befehl funktionierte auch für mich, andere Ergebnisse, selbst der mit 528 Stimmen, funktionierten nicht.
Brano
-4

In SQL Server 2008 R2 funktioniert dies:

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

Und listen Sie nur Datenbanken auf, die von Benutzern erstellt wurden.

saper_2
quelle
10
Edit: Das ist so falsch! owner_sid=1bedeutet saBesitzer, nichts Besonderes.
wqw
-4

Sie finden alle Datenbanknamen wie folgt: -

 select name from sys.sysdatabases
David Sam
quelle
2
Fügt nichts über die Antworten hinzu, die Jahre zuvor gepostet wurden
Martin Smith
-4

So schließen Sie Systemdatenbanken aus:

SELECT name FROM master.dbo.sysdatabases where sid <>0x01
Luca
quelle
Dies schloss den größten Teil meiner Datenbank aus.
Jeff
Warum fügen Sie die where-Klausel hinzu? Dies schließt die Systemdatenbanken aus, das OP fordert dies nicht an. Wenn Sie das nächste Mal eine Antwort hinzufügen, erklären Sie, was die Abfrage bewirkt. Und daneben gibt es keine sidSpalte auf dem sys.databasesTischowner_sid
Jordy van Eijk