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.
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
à 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
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
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4
Fonctionne sur notre SQL Server 2008
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
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.
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.
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();
}
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.
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]
Dans SQL Server 7, les dbid 1 à 4 sont les dbs système.