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.

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

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


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

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


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

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.


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


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

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.


1

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


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]

-1

je suis peut-être un dodo!

show databases; travaillé pour moi.


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.


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

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.