web-dev-qa-db-fra.com

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

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

336
sef

Exécuter:

SELECT name FROM master.sys.databases

C’est l’approche privilégiée à présent, plutôt que dbo.sysdatabases, qui est obsolète depuis un certain temps.


Exécutez cette requête:

SELECT name FROM master.dbo.sysdatabases

ou si vous préférez

EXEC sp_databases
541
Ben Hoffstein

à la lumière de l'ambiguïté sur le nombre de bases de données non-utilisateur, vous devriez probablement ajouter:

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

et ajouter les noms des bases de données des services de génération de rapports

81
GilShalit

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

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

Modifié: 14h36 PM 25/02/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
52
GilM
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 

Fonctionne sur notre SQL Server 2008

27
Frank

Puisque vous utilisez .NET, vous pouvez utiliser le SQL Server Management Objects

Dim server As New Microsoft.SqlServer.Management.Smo.Server("localhost")
For Each db As Database In server.Databases
    Console.WriteLine(db.Name)
Next
22
Chris Diver

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 la base de données ci-dessus dans votre ordinateur par défaut.

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

Cela fonctionnera pour les deux conditions, que la notification soit activée ou non.

7
ManiG

J'utilise le code SQL Server Management Objects suivant pour obtenir une liste des bases de données qui ne sont ni des bases de données système ni 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();
}
5
Rob Prouse

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 système "sp_databases". Je supprime seulement la colonne inutile et ajoute où les conditions.

2

Je ne sais pas si cela omettra les bases de données du serveur de rapports car je n'en exécute pas, mais de ce que j'ai vu, je peux omettre les bases de données appartenant à l'utilisateur système avec ce code 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
watch_amajigger

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

1
JerryOL