Réponses:
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
exec sp_databases
n'a pas fonctionné. Les deux autres ( master.dbo.sysdatabases
et sys.databases
) fonctionnent toujours.
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
SELECT [name]
FROM master.dbo.sysdatabases
WHERE dbid > 4
Fonctionne sur notre SQL Server 2008
ID
5 et 6 seront ReportServer
et ReportServerTempDB
si vous avez SQL Server Reporting Services
installé.
É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();
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.
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
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();
}
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
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.
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]
je suis peut-être un dodo!
show databases;
travaillé pour moi.
Vous pouvez trouver tous les noms de base de données avec ceci: -
select name from sys.sysdatabases
Pour exclure des bases de données système:
SELECT name FROM master.dbo.sysdatabases where sid <>0x01
sid
colonne sur la sys.databases
tableowner_sid