Antworten:
Ausführen:
SELECT name FROM master.sys.databases
Dies ist jetzt der bevorzugte Ansatz und nicht dbo.sysdatabases
der seit einiger Zeit veraltete.
Führen Sie diese Abfrage aus:
SELECT name FROM master.dbo.sysdatabases
oder wenn Sie es vorziehen
EXEC sp_databases
exec sp_databases
das nicht funktioniert. Die anderen beiden ( master.dbo.sysdatabases
und sys.databases
) funktionieren noch.
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
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4
Funktioniert auf unserem SQL Server 2008
ID
5 und 6 werden ReportServer
und ReportServerTempDB
wenn Sie SQL Server Reporting Services
installiert haben.
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
var SDBLOC = new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases.Cast<Microsoft.SqlServer.Management.Smo.Database>().Where(bs => !bs.IsSystemObject && bs.ID>6).ToList();
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.
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
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();
}
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
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.
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]
Vielleicht bin ich ein Dodo!
show databases;
arbeitete für mich.
Sie finden alle Datenbanknamen wie folgt: -
select name from sys.sysdatabases
So schließen Sie Systemdatenbanken aus:
SELECT name FROM master.dbo.sysdatabases where sid <>0x01
sid
Spalte auf dem sys.databases
Tischowner_sid