Risposte:
Eseguire:
SELECT name FROM master.sys.databases
Questo è l'approccio preferito ora, piuttosto che dbo.sysdatabases
, che è stato deprecato per qualche tempo.
Eseguire questa query:
SELECT name FROM master.dbo.sysdatabases
o se preferisci
EXEC sp_databases
exec sp_databases
non ha funzionato. Gli altri due ( master.dbo.sysdatabases
e sys.databases
) funzionano ancora.
Per escludere i database di sistema:
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 6
Modificato: 14:36 2/5/2013
Aggiornato con accurate database_id, dovrebbe essere maggiore di 4, per saltare l'elenco dei database di sistema che hanno un ID database compreso tra 1 e 4.
SELECT *
FROM sys.databases d
WHERE d.database_id > 4
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4
Funziona sul nostro SQL Server 2008
ID
5 e 6 saranno ReportServer
e ReportServerTempDB
se hai SQL Server Reporting Services
installato.
Poiché si utilizza .NET, è possibile utilizzare gli oggetti di gestione di 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();
Non confonderti, usa la semplice query qui sotto per ottenere tutti i database,
select * from sys.databases
Se hai bisogno solo dei database definiti dall'utente;
select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb');
Alcuni dei nomi di database di sistema sono (risorsa, distribuzione, reportservice, reportservicetempdb) e basta inserirlo nella query. Se hai i db sopra nella tua macchina come impostazione predefinita.
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'
Funzionerà per entrambe le condizioni, indipendentemente dal fatto che il reporting sia abilitato o meno
Uso il seguente codice SQL Server Management Objects per ottenere un elenco di database che non sono database di sistema e non sono istantanee.
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();
o foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)
come in .NET 4.0 + SQL Server 2014 o .SqlServer.Smo \ 12.0.0.0
Se si desidera omettere database di sistema e tabelle ReportServer (se installati):
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
Funziona su SQL Server 2008/2012/2014. La maggior parte delle query proviene dalla stored procedure di sistema " sp_database ". Rimuovo solo la colonna non necessaria e ho aggiunto dove condizioni.
Non sono sicuro se questo ometterà i database del server di report poiché non ne sto eseguendo uno, ma da quello che ho visto, posso omettere i database di proprietà dell'utente di sistema con questo SQL:
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]
forse sono un dodo!
show databases;
ha funzionato per me.
Puoi trovare tutti i nomi di database con questo: -
select name from sys.sysdatabases
Per escludere i database di sistema:
SELECT name FROM master.dbo.sysdatabases where sid <>0x01
sid
sua colonna sul sys.databases
tavolo la suaowner_sid