2008-09-29 7 views

Répondre

397

Exécuter 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. http://msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx –

+4

EXEC sp_databases était _slow_ à exécuter pour moi; 40 secondes sur une instance avec 36 bases de données. La sélection à partir de sysdatabases était instantanée. – MarcE

+6

Pour développer ce que @ChrisDiver a dit: SELECT nom FROM sys.databases est l'approche préférée maintenant, plutôt que dbo.sysdatabases, qui a été déprécié depuis une décennie maintenant. – Micah

46

Pour exclure les bases de données du système:

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

Modifié: 14h36 2/5/2013

Mise à jour avec database_id précis, il devrait être supérieur à 4, pour sauter la liste des bases de données système qui ont des id de base de données 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. –

+1

On dirait qu'il devrait toujours être> 4, bien que le serveur que je vérifie a "ReportServer" et "ReportServerTempDB" dans les positions 5 et 6. – Trisped

+0

pour moi> 6 le feraient. –

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

Works sur notre SQL Server 2008

10

Les bases de données système avec ID 5 et 6 seront ReportServer et ReportServerTempDB si SQL Server Reporting Services est installé.

+0

Seulement si vous étiez (stupide ET installé Reporting Services utilisant le programme d'installation SQL (plutôt que de ne pas accepter les valeurs par défaut et de configurer ultérieurement le gestionnaire)) OU (serveur SQL génial ET installé utilisant un fichier INF préconfiguré) –

68

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

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

et ajoutez les noms des bases de données des services de reporting

2

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

-1

Dans SQL Server 2008 R2 ceci fonctionne:

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

et la liste des bases de données créées uniquement par l'utilisateur (s).

+0

Essayez 'owner_sid <> 1' – wqw

+7

Edit: C'est tellement faux! 'owner_sid = 1' signifie' sa' propriétaire, rien de spécial à ce sujet. – wqw

19

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 
+0

'var SDBLOC = nouveau Microsoft.SqlServer.Management.Smo.Server (" localhost "). Databases.Cast (). Où (bs =>! Bs.IsSystemObject && bs. ID> 6) .ToList(); ' –

+0

Je doute, il (localhost), est lu à partir d'un fichier de configuration. Je ne pouvais pas le faire fonctionner avec mon "myhost" (qui est mon nom d'hôte correct, disons obtenu par Environment.MachineName). Est-ce que ce travail fonctionnera si je remplace "localhost" par "myhost"? –

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

Cela fonctionne à la fois la condition, que ce soit des rapports est activée ou non

+1

Attention, si votre serveur est une instance nommée, les noms de base de données ReportServer sont similaires à ReportServer $ InstanceName et ReportServer $ InstanceNameTempDB. Donc, ceci fonctionnerait de toute façon: SELECT [nom] FROM master.dbo.Sysdatabases OÙ dbid> 4 et [nom] NOT LIKE '% ReportServer' – ToddK

3

J'utilise le code suivant pour obtenir SQL Server Management Objects 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(); 
} 
+0

un oneliner. 'var DBsLOC = new Microsoft.SqlServer.Management.Smo.Server ("localhost") Databases.Cast () Où (bs => bs.IsSystemObject && bs.ID> 6!) .ToList() '' ou foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server (» localhost "). Bases de données)' comme dans .NET 4.0 + SQL Server 2014 ou .SqlServer.Smo \ 12.0.0.0 –

1

Si vous souhaitez omettre les bases de données du système et des tables de ReportServer (le cas échéant):

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 seulement la colonne inutile et ajouté où les conditions.

10

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

select * from sys.databases 

Si u besoin que les 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 (ressources, la distribution, ReportService, reportservicetempdb) Il suffit d'insérer dans la requête. Si vous avez les db ci-dessus dans votre machine par défaut.

1

Je ne sais pas si cela omettre les bases de données du serveur de rapports depuis que je ne suis pas en cours d'exécution d'un, mais de ce que je l'ai vu, je peux omettre les bases de données appartenant à des 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

Vous pouvez trouver toutes les noms de bases de données avec ceci: -

select name from sys.sysdatabases 
+0

N'ajoute rien sur les réponses publiées des années plus tôt –

2

peut-être que je suis un dodo!

show databases; travaillé pour moi.

+3

Pas dans SQL Server –

-1

Pour exclure les bases de données du système:

SELECT name FROM master.dbo.sysdatabases where sid <>0x01 
+0

Cela a exclu la plupart de ma base de données. – Jeff

0

Vous pouvez utiliser.

select Name from sys.Databases 

Il liste toutes les bases de données présentes.

Testé dans la dernière version jusqu'à maintenant (SQL Server 2017).

Questions connexes