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.

sef
fonte

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
Ben Hoffstein
fonte
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

GilShalit
fonte
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
GilM
fonte
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

Frank
fonte
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
Chris Diver
fonte
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.

Balaji
fonte
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

ManiG
fonte
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();
}
Rob Prouse
fonte
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.

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

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

JerryOL
fonte
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]
watch_amajigger
fonte
-1

talvez eu seja um dodô!

show databases; trabalhou para mim.

thedanotto
fonte
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).

saper_2
fonte
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
david sam
fonte
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
Luca
fonte
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