Ottieni l'elenco dei database da SQL Server


381

Come posso ottenere l'elenco dei database disponibili su un'istanza di SQL Server? Sto programmando di crearne un elenco in una casella combinata in VB.NET.

Risposte:


614

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

5
@Gia Esiste come una vista di compatibilità all'indietro. msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Chris Diver

4
EXEC sp_database era lento da eseguire per me; 40 secondi su un'istanza con 36 database. La selezione da database di sistema è stata immediata.
Marc

10
Per espandere ciò che ha detto @ChrisDiver: SELEZIONARE il nome DA sys.d Database è l'approccio preferito ora, piuttosto che dbo.sysdatabase, che è ormai obsoleto da un decennio.
Michea il

3
Almeno su SQL Server 2014, exec sp_databasesnon ha funzionato. Gli altri due ( master.dbo.sysdatabasese sys.databases) funzionano ancora.
r2evans,

86

alla luce dell'ambiguità relativa al numero di database non utente, probabilmente dovresti aggiungere:

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

e aggiungere i nomi dei database dei servizi di reporting


53

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

7
Questo non funziona. Forse intendevi> 4? Le tabelle 5 e 6 sono tabelle utente.
Fuori dagli schemi

1
Sembra che dovrebbe essere sempre> 4, anche se il server che sto controllando ha "ReportServer" e "ReportServerTempDB" nelle posizioni 5 e 6.
Trisped il

per me> 6 farebbe.
Robb_2015,

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

Funziona sul nostro SQL Server 2008


Database di sistema con ID5 e 6 saranno ReportServere ReportServerTempDBse hai SQL Server Reporting Servicesinstallato.
Charles Hepner,

22

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();
Robb_2015,

Ne dubito (localhost), viene letto da alcuni file di configurazione. Non sono riuscito a farlo funzionare con il mio "myhost" (che è il mio nome host corretto, ad esempio ottenuto da Environment.MachineName) .Sarà così se sostituisco "localhost" con "myhost"?
Ajeeb.KP,

19

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.


7
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


1
Attenzione, se il tuo server è un'istanza denominata, i nomi db di ReportServer sono come ReportServer $ InstanceName e ReportServer $ InstanceNameTempDB. Quindi, funzionerebbe in entrambi i modi: SELEZIONA [nome] DA master.dbo.sysdatabase DOVE dbid> 4 e [nome] NON COME "ReportServer%"
ToddK

5

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();
}

un 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();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
Robb_2015

2

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.


1

In SQL Server 7, dbid da 1 a 4 sono i dbs di sistema.


1

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]

-1

forse sono un dodo!

show databases; ha funzionato per me.


14
Non in SQL Server
Martin Smith,

1
la mia risposta mi ha aiutato di nuovo. #blessed
thedanotto

questo comando ha funzionato anche per me, altro risultato anche quello con 528 voti non ha funzionato.
Brano,

-4

In SQL Server 2008 R2 funziona:

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

Ed elenca solo i database creati dall'utente (i).


10
Modifica: è così sbagliato! owner_sid=1significa saproprietario, niente di speciale.
wqw,

-4

Puoi trovare tutti i nomi di database con questo: -

 select name from sys.sysdatabases

2
Non aggiunge nulla alle risposte postate anni prima
Martin Smith,

-4

Per escludere i database di sistema:

SELECT name FROM master.dbo.sysdatabases where sid <>0x01

Ciò ha escluso la maggior parte del mio database.
Jeff,

Perché stai aggiungendo la clausola where? Ciò escluderà i database di sistema, l'OP non lo richiede. E la prossima volta se aggiungi una risposta, spiega cosa fa la query. E accanto a ciò non c'è la sidsua colonna sul sys.databasestavolo la suaowner_sid
Jordy van Eijk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.