Obtenir la liste des bases de données à partir de SQL Server

381

Comment obtenir la liste des bases de données disponibles sur une instance SQL Server? Je prévois d'en faire une liste dans une zone de liste déroulante dans VB.NET.

sef
la source

Réponses:

614

Exécuter:

SELECT name FROM master.sys.databases

C'est l'approche préférée maintenant, plutôt que dbo.sysdatabases, qui est déconseillée depuis un certain temps.


Exécutez cette requête:

SELECT name FROM master.dbo.sysdatabases

ou si vous préférez

EXEC sp_databases
Ben Hoffstein
la source
5
@Gia Il existe en tant que vue de compatibilité ascendante. msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Chris Diver
4
EXEC sp_databases a été lent à s'exécuter pour moi; 40 secondes sur une instance avec 36 bases de données. La sélection dans les bases de données système a été instantanée.
MarcE
10
Pour développer ce que @ChrisDiver a dit: SELECT name FROM sys.databases est l'approche préférée maintenant, plutôt que dbo.sysdatabases, qui est obsolète depuis une décennie maintenant.
Micah
3
Au moins sur SQL Server 2014, exec sp_databasesn'a pas fonctionné. Les deux autres ( master.dbo.sysdatabaseset sys.databases) fonctionnent toujours.
r2evans
86

à la lumière de l'ambiguïté quant au nombre de bases de données non utilisateurs, vous devez probablement ajouter:

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

et ajouter les noms des bases de données de Reporting Services

GilShalit
la source
53

Pour exclure des bases de données système:

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

Modifié: 14h36 02/05/2013

Mis à jour avec database_id précis, il doit être supérieur à 4, pour ignorer la liste des bases de données système dont l'ID de base de données est compris entre 1 et 4.

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4
GilM
la source
7
Cela ne fonctionne pas. Peut-être que vous vouliez dire> 4? Les tableaux 5 et 6 sont des tableaux d'utilisateurs.
Outside the Box Developer
1
Il semble qu'il devrait toujours être> 4, bien que le serveur que je vérifie ait "ReportServer" et "ReportServerTempDB" dans les positions 5 et 6.
Trisped
pour moi> 6 ferait l'affaire.
Robb_2015
27
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 

Fonctionne sur notre SQL Server 2008

Franc
la source
Les bases de données système avec ID5 et 6 seront ReportServeret ReportServerTempDBsi vous avez SQL Server Reporting Servicesinstallé.
Charles Hepner
22

Étant donné que vous utilisez .NET, vous pouvez utiliser les objets de gestion 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
Chris Diver
la source
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
Je doute, il (localhost), est lu à partir d'un fichier de configuration. Je n'ai pas pu le faire fonctionner avec mon "myhost" (qui est mon nom d'hôte correct, disons obtenu par Environment.MachineName). Est-ce que cela fonctionnera si je remplace "localhost" par "myhost"?
Ajeeb.KP
19

Ne vous trompez pas, utilisez la requête simple ci-dessous pour obtenir toutes les bases de données,

select * from sys.databases

Si vous n'avez besoin que des bases de données définies par l'utilisateur;

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

Certains des noms de base de données système sont (ressource, distribution, reportservice, reportservicetempdb) il suffit de l'insérer dans la requête. Si vous avez les bases de données ci-dessus dans votre machine par défaut.

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

Cela fonctionnera pour les deux conditions, que le rapport soit activé ou non

ManiG
la source
1
Attention, si votre serveur est une instance nommée, les noms de base de données ReportServer sont comme ReportServer $ InstanceName et ReportServer $ InstanceNameTempDB. Donc, cela fonctionnerait dans les deux sens: SELECT [nom] FROM master.dbo.sysdatabases WHERE dbid> 4 et [nom] PAS COMME 'ReportServer%'
ToddK
5

J'utilise le code SQL Server Management Objects suivant pour obtenir une liste de bases de données qui ne sont pas des bases de données système et ne sont pas des instantanés.

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
la source
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();ou foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)comme dans .NET 4.0 + SQL Server 2014 ou .SqlServer.Smo \ 12.0.0.0
Robb_2015
2

Si vous souhaitez omettre les bases de données système et les tables ReportServer (si installées):

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

Cela fonctionne sur Sql Server 2008/2012/2014. La plupart des requêtes proviennent de la procédure stockée système " sp_databases ". Je supprime uniquement la colonne inutile et j'ai ajouté les conditions Where.

Tarık Özgün Güner
la source
1

Dans SQL Server 7, les dbid 1 à 4 sont les dbs système.

JerryOL
la source
1

Je ne sais pas si cela omettra les bases de données du serveur de rapports car je n'en exécute pas, mais d'après ce que j'ai vu, je peux omettre les bases de données appartenant aux utilisateurs du système avec ce 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]
watch_amajigger
la source
-1

je suis peut-être un dodo!

show databases; travaillé pour moi.

thedanotto
la source
14
Pas dans SQL Server
Martin Smith
1
ma réponse m'a encore aidé. #blessed
thedanotto
cette commande a également fonctionné pour moi, un autre résultat, même celui avec 528 votes, n'a pas fonctionné.
Brano
-4

Dans SQL Server 2008 R2, cela fonctionne:

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

Et répertoriez uniquement les bases de données créées par les utilisateurs.

saper_2
la source
10
Edit: C'est tellement faux! owner_sid=1signifie sapropriétaire, rien de spécial à ce sujet.
wqw
-4

Vous pouvez trouver tous les noms de base de données avec ceci: -

 select name from sys.sysdatabases
david sam
la source
2
N'ajoute rien aux réponses publiées des années plus tôt
Martin Smith
-4

Pour exclure des bases de données système:

SELECT name FROM master.dbo.sysdatabases where sid <>0x01
Luca
la source
Cela a exclu la plupart de ma base de données.
Jeff
Pourquoi ajoutez-vous la clause where? Cela exclura les bases de données système, l'OP ne le demande pas. Et la prochaine fois, si vous ajoutez une réponse, expliquez ce que fait la requête. Et à côté de cela, il n'y a pas de sidcolonne sur la sys.databasestableowner_sid
Jordy van Eijk