Obtenga una lista de bases de datos de SQL Server

381

¿Cómo puedo obtener la lista de bases de datos disponibles en una instancia de SQL Server? Estoy planeando hacer una lista de ellos en un cuadro combinado en VB.NET.

sef
fuente

Respuestas:

614

Ejecutar:

SELECT name FROM master.sys.databases

Este es el enfoque preferido ahora, en lugar de dbo.sysdatabases, que ha quedado en desuso por algún tiempo.


Ejecute esta consulta:

SELECT name FROM master.dbo.sysdatabases

o si lo prefieres

EXEC sp_databases
Ben Hoffstein
fuente
55
@Gia Existe como una vista de compatibilidad hacia atrás. msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Chris Diver
44
EXEC sp_databases tardó en ejecutarse para mí; 40 segundos en una instancia con 36 bases de datos. Seleccionar de las bases de datos sysdata fue instantáneo.
MarcE
10
Para ampliar lo que dijo @ChrisDiver: SELECT name FROM sys.databases es el enfoque preferido ahora, en lugar de dbo.sysdatabases, que ha quedado en desuso durante una década.
Micah
3
Al menos en SQL Server 2014, exec sp_databasesno funcionó. Los otros dos ( master.dbo.sysdatabasesy sys.databases) todavía funcionan.
r2evans
86

a la luz de la ambigüedad en cuanto al número de bases de datos que no son usuarios, probablemente debería agregar:

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

y agregue los nombres de las bases de datos de servicios de informes

GilShalit
fuente
53

Para excluir las bases de datos del sistema:

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

Editado: 2:36 PM 2/5/2013

Actualizado con database_id preciso, debe ser mayor que 4, para omitir la lista de bases de datos del sistema que tienen un ID de base de datos entre 1 y 4.

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4
GilM
fuente
77
Esto no funciona. ¿Quizás quisiste decir> 4? Las tablas 5 y 6 son tablas de usuario.
Desarrollador fuera de la caja
1
Parece que siempre debería ser> 4, aunque el servidor que estoy comprobando tiene "ReportServer" y "ReportServerTempDB" en las posiciones 5 y 6.
Trisped
para mí> 6 haría.
Robb_2015
27
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 

Funciona en nuestro SQL Server 2008

Franco
fuente
Las bases de datos del sistema con ID5 y 6 serán ReportServery ReportServerTempDBsi las tiene SQL Server Reporting Servicesinstaladas.
Charles Hepner
22

Como está utilizando .NET, puede usar los objetos de administración de 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
Chris Diver
fuente
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
Lo dudo (localhost), se lee de algún archivo de configuración. No pude hacerlo funcionar con mi "myhost" (que es mi nombre de host correcto, por ejemplo, obtenido por Environment.MachineName). ¿Funcionará si reemplazo "localhost" con "myhost"?
Ajeeb.KP
19

No se confunda, use la consulta simple a continuación para obtener todas las bases de datos,

select * from sys.databases

Si solo necesita las bases de datos definidas por el usuario;

select * from sys.databases WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb'); 

Algunos de los nombres de bases de datos del sistema son (recurso, distribución, servicio de informes, informes, servicio, tmpdb) simplemente insértelo en la consulta. Si tiene los db anteriores en su máquina por defecto.

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

Esto funcionará para ambas condiciones, ya sea que los informes estén habilitados o no

ManiG
fuente
1
Cuidado, si su servidor es una instancia con nombre, los nombres de DB de ReportServer son como ReportServer $ InstanceName y ReportServer $ InstanceNameTempDB. Entonces, esto funcionaría de cualquier manera: SELECCIONE [nombre] DESDE master.dbo.sysdatabases DONDE dbid> 4 y [nombre] NO ME GUSTA 'ReportServer%'
ToddK
5

Uso el siguiente código de Objetos de administración de SQL Server para obtener una lista de bases de datos que no son bases de datos del sistema y no son instantáneas.

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();
}
Rob Prouse
fuente
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();o foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)como en .NET 4.0 + SQL Server 2014 o .SqlServer.Smo \ 12.0.0.0
Robb_2015
2

Si desea omitir las bases de datos del sistema y las tablas de ReportServer (si están instaladas):

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

Esto funciona en SQL Server 2008/2012/2014. La mayor parte de la consulta proviene del procedimiento almacenado del sistema " sp_databases ". Solo elimino la columna innecesaria y agrego donde las condiciones.

Tarık Özgün Güner
fuente
1

En SQL Server 7, dbid 1 a 4 son los dbs del sistema.

JerryOL
fuente
1

No estoy seguro de si esto omitirá las bases de datos del servidor de informes ya que no estoy ejecutando una, pero por lo que he visto, puedo omitir las bases de datos propiedad del usuario del sistema con este 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]
watch_amajigger
fuente
-1

tal vez soy un dodo!

show databases; trabajó para mi.

thedanotto
fuente
14
No en SQL Server
Martin Smith
1
mi respuesta me ayudó nuevamente. #blessed
thedanotto
este comando también funcionó para mí, otro resultado que incluso el que tenía 528 votos no funcionó.
Brano
-4

En SQL Server 2008 R2 esto funciona:

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

Y enumere solo las bases de datos creadas por los usuarios.

saper_2
fuente
10
Editar: ¡Esto está muy mal! owner_sid=1significa sapropietario, no tiene nada de especial.
wqw
-4

Puede encontrar todos los nombres de bases de datos con esto: -

 select name from sys.sysdatabases
david sam
fuente
2
No agrega nada sobre las respuestas publicadas años antes
Martin Smith
-4

Para excluir las bases de datos del sistema:

SELECT name FROM master.dbo.sysdatabases where sid <>0x01
Luca
fuente
Esto excluyó la mayor parte de mi base de datos.
Jeff
¿Por qué agrega la cláusula where? Esto excluirá las bases de datos del sistema, el OP no está pidiendo esto. Y la próxima vez, si agrega una respuesta, explique qué hace la consulta. Y al lado de eso no hay una sidcolumna sobre la sys.databasesmesaowner_sid
Jordy van Eijk