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 machen.
Antworten
Zu viele Anzeigen?Da Sie .NET verwenden, können Sie die SQL Server-Verwaltungsobjekte
Dim server As New Microsoft.SqlServer.Management.Smo.Server("localhost")
For Each db As Database In server.Databases
Console.WriteLine(db.Name)
Next
Ich verwende die folgenden SQL Server-Verwaltungsobjekte Code, um eine Liste von Datenbanken zu erhalten, 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();
}
Wenn Sie die Systemdatenbanken und ReportServer-Tabellen (falls installiert) auslassen wollen
select DATABASE_NAME = db_name(s_mf.database_id)
from sys.master_files s_mf
where
s_mf.state = 0 -- ONLINE
and 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 mit SQL Server 2008/2012/2014. Die meisten Abfragen kommen von " sp_databases System Stored Procedure". Ich habe nur eine nicht benötigte Spalte entfernt und Where-Bedingungen hinzugefügt.
Ich bin mir nicht sicher, ob dadurch die Datenbanken des Berichtsservers ausgelassen werden, da ich keinen verwende, aber nach dem, was ich gesehen habe, kann ich mit diesem SQL die Datenbanken auslassen, die dem Systembenutzer gehören:
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]