Obter lista de bancos de dados do SQL Server


381

Como posso obter a lista de bancos de dados disponíveis em uma instância do SQL Server? Estou planejando fazer uma lista deles em uma caixa de combinação no VB.NET.

Respostas:


614

Executar:

SELECT name FROM master.sys.databases

Essa é a abordagem preferida agora, e não dbo.sysdatabases, que está obsoleta há algum tempo.


Execute esta consulta:

SELECT name FROM master.dbo.sysdatabases

ou se você preferir

EXEC sp_databases

5
@Gia Ele existe como uma visão de compatibilidade com versões anteriores. msdn.microsoft.com/pt-br/library/ms179900%28v=SQL.110%29.aspx
Chris Diver

4
O sp_databases do EXEC demorou a ser executado para mim; 40 segundos em uma instância com 36 bancos de dados. A seleção dos bancos de dados sys foi instantânea.
Marce

10
Para expandir o que o @ChrisDiver disse: SELECT name FROM sys.databases é a abordagem preferida agora, em vez de dbo.sysdatabases, que está obsoleto há uma década.
Micah

3
Pelo menos no SQL Server 2014, exec sp_databasesnão funcionou. Os outros dois ( master.dbo.sysdatabasese sys.databases) ainda funcionam.
R2evans

86

À luz da ambiguidade quanto ao número de bancos de dados não-usuários, você provavelmente deve adicionar:

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

e adicione os nomes dos bancos de dados do Reporting Services


53

Para excluir bancos de dados do sistema:

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

Edição: 14:36 ​​05/02/2013

Atualizado com database_id preciso, deve ser maior que 4, para pular a lista de bancos de dados do sistema que possuem ID de banco de dados entre 1 e 4.

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4

7
Isso não funciona. Talvez você quisesse dizer> 4? As tabelas 5 e 6 são tabelas de usuários.
Outside the Box Developer

11
Parece que sempre deve ser> 4, embora o servidor que estou verificando tenha "ReportServer" e "ReportServerTempDB" nas posições 5 e 6.
Trisped

para mim> 6 faria.
Robb_2015

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

Funciona em nosso SQL Server 2008


Os bancos de dados do sistema com ID5 e 6 serão ReportServere ReportServerTempDBse você tiver SQL Server Reporting Servicesinstalado.
Charles Hepner 28/03

22

Como você está usando o .NET, você pode usar os Objetos de Gerenciamento do 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();
Robb_2015

Duvido que (localhost) seja lido de algum arquivo de configuração. Não consegui fazê-lo funcionar com meu "myhost" (que é o meu nome de host correto, por exemplo, obtido por Environment.MachineName). Isso funcionará se eu substituir "localhost" por "myhost"?
Ajeeb.KP

19

Não fique confuso, use a consulta simples abaixo para obter todos os bancos de dados,

select * from sys.databases

Se você precisar apenas dos bancos de dados definidos pelo usuário;

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

Alguns dos nomes de banco de dados do sistema são (recurso, distribuição, serviço de relatórios, reportservicetempdb), basta inseri-lo na consulta. Se você tiver os bancos de dados acima em sua máquina como padrão.


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

Isso funcionará para ambas as condições: se o relatório está ativado ou não


11
Cuidado, se o servidor for uma instância nomeada, os nomes de banco de dados ReportServer serão como ReportServer $ InstanceName e ReportServer $ InstanceNameTempDB. Portanto, isso funcionaria de qualquer maneira: SELECT [name] FROM master.dbo.sysdatabases WHERE dbid> 4 e [name] NOT LIKE 'ReportServer%' #
ToddK

5

Eu uso o código a seguir do SQL Server Management Objects para obter uma lista de bancos de dados que não são do sistema e não são instantâneos.

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();
}

um 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();ou foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)como no .NET 4.0 + SQL Server 2014 ou .SqlServer.Smo \ 12.0.0.0
Robb_2015

2

Se você deseja omitir bancos de dados do sistema e tabelas ReportServer (se instalado):

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

Isso funciona no Sql Server 2008/2012/2014. A maioria das consultas vem do procedimento armazenado do sistema " sp_databases ". Eu removo apenas a coluna desnecessária e adicionei as condições.


1

No SQL Server 7, dbid 1 a 4 são os dbs do sistema.


1

Não tenho certeza se isso omitirá os bancos de dados do servidor de relatório, pois não estou executando um, mas pelo que vi, posso omitir bancos de dados de propriedade do usuário do sistema com 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]

-1

talvez eu seja um dodô!

show databases; trabalhou para mim.


14
Não está no SQL Server
Martin Smith

11
minha resposta apenas me ajudou novamente. #blessed
thedanotto

esse comando funcionou para mim também, outro resultado, mesmo aquele com 528 votos não funcionou.
Brano

-4

No SQL Server 2008 R2, isso funciona:

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

E liste apenas bancos de dados criados pelo (s) usuário (s).


10
Edit: Isso é tão errado! owner_sid=1significa sadono, nada de especial nisso.
Wqw 21/09/12

-4

Você pode encontrar todos os nomes de banco de dados com este: -

 select name from sys.sysdatabases

2
Não acrescenta nada ao longo dos anos respostas postadas anteriores
Martin Smith

-4

Para excluir bancos de dados do sistema:

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

Isso excluiu a maior parte do meu banco de dados.
27417 Jeff Jeff

Por que você está adicionando a cláusula where? Isso excluirá os bancos de dados do sistema, o OP não está solicitando isso. E da próxima vez, se você adicionar uma resposta, explique o que a consulta faz. E ao lado disso não há sidcoluna na sys.databasestabelaowner_sid
Jordy van Eijk
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.