Получить список баз данных из SQL Server

381

Как я могу получить список доступных баз данных на экземпляре SQL Server? Я планирую сделать их список в поле со списком в VB.NET.

Сеф
источник

Ответы:

614

Выполнение:

SELECT name FROM master.sys.databases

Это предпочтительный подход сейчас, а не dbo.sysdatabases, который уже давно устарел.


Выполните этот запрос:

SELECT name FROM master.dbo.sysdatabases

или если вы предпочитаете

EXEC sp_databases
Бен Хоффштейн
источник
5
@Gia Это существует как вид обратной совместимости. msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Крис Дайвер,
4
EXEC sp_databases медленно выполнялся для меня; 40 секунд для экземпляра с 36 базами данных. Выбор из системной базы данных был мгновенным.
MarcE
10
Чтобы расширить то, что сказал @ChrisDiver: SELECT name FROM sys.databases является предпочтительным подходом в настоящее время, а не dbo.sysdatabases, который устарел в течение десятилетия.
Мика
3
По крайней мере, на SQL Server 2014, exec sp_databasesне работал. Два других ( master.dbo.sysdatabasesи sys.databases) все еще работают.
r2evans
86

в свете двусмысленности в отношении количества непользовательских баз данных, вы, вероятно, должны добавить:

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

и добавьте имена баз данных служб отчетов

GilShalit
источник
53

Чтобы исключить системные базы данных:

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

Отредактировано: 14:36 ​​2/2/2013

Обновлен с точным значением database_id. Оно должно быть больше 4, чтобы пропустить список системных баз данных с идентификатором базы данных от 1 до 4.

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4
GilM
источник
7
Это не работает. Возможно, вы имели в виду> 4? Таблицы 5 и 6 являются пользовательскими таблицами.
Вне коробки Разработчик
1
Похоже, что всегда должно быть> 4, хотя сервер, который я проверяю, имеет «ReportServer» и «ReportServerTempDB» в 5 и 6 позициях.
Trisped
для меня> 6 сделал бы.
Robb_2015
27
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 

Работает на нашем SQL Server 2008

Фрэнк
источник
Системные базы с ID5 и 6 будут, ReportServerи ReportServerTempDBесли вы их SQL Server Reporting Servicesустановили.
Чарльз Хепнер
22

Поскольку вы используете .NET, вы можете использовать объекты управления 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
Я сомневаюсь, что он (localhost) читается из какого-либо файла конфигурации. Я не мог заставить его работать с моим "myhost" (это мое правильное имя хоста, скажем, полученное Environment.MachineName). Будет ли эта работа, если я заменим "localhost" на "myhost"?
Ajeeb.KP
19

Не запутайтесь, используйте приведенный ниже простой запрос, чтобы получить все базы данных,

select * from sys.databases

Если вам нужны только пользовательские базы данных;

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

Некоторые имена системных баз данных (ресурс, дистрибуция, reportservice, reportservicetempdb) просто вставляют его в запрос. Если у вас есть вышеупомянутые БД в вашей машине по умолчанию.

Баладжи
источник
7
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'

Это будет работать для обоих условий, независимо от того, включена ли отчетность

ManiG
источник
1
Будьте осторожны, если ваш сервер является именованным экземпляром, имена БД ReportServer похожи на ReportServer $ InstanceName и ReportServer $ InstanceNameTempDB. Так что это будет работать в любом случае: SELECT [name] FROM master.dbo.sysdatabases WHERE dbid> 4 и [name] НЕ НРАВИТСЯ 'ReportServer%'
ToddK
5

Я использую следующий код объектов управления SQL Server, чтобы получить список баз данных, которые не являются системными и не являются моментальными снимками.

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();
}
Роб Проуз
источник
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();или foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)как в .NET 4.0 + SQL Server 2014 или .SqlServer.Smo \ 12.0.0.0
Robb_2015
2

Если вы хотите опустить системные базы данных и таблицы ReportServer (если установлены):

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

Это работает на Sql Server 2008/2012/2014. Большая часть запросов поступает из системной хранимой процедуры sp_databases . Я только удалил ненужный столбец и добавил, где условия.

Tarık Özgün Güner
источник
1

В SQL Server 7, от 1 до 4 - это системные базы данных.

JerryOL
источник
1

Не уверен, что при этом будут пропущены базы данных сервера отчетов, поскольку я не использую их, но из того, что я видел, я могу опустить системные пользовательские базы данных с этим 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
источник
-1

возможно я додо!

show databases; работал на меня.

thedanotto
источник
14
Не в SQL Server
Мартин Смит
1
мой ответ только что помог мне снова. #blessed
thedanotto
эта команда работала и у меня, другой результат, даже тот, который набрал 528 голосов, не сработал.
Брано
-4

В SQL Server 2008 R2 это работает:

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

И список только базы данных, созданные пользователем (-ями).

saper_2
источник
10
Редактировать: это так неправильно! owner_sid=1значит saвладелец, ничего особенного в этом нет.
WQW
-4

Вы можете найти все имена баз данных с этим: -

 select name from sys.sysdatabases
Дэвид Сэм
источник
2
Ничего не добавляет к ответам, опубликованным годами ранее
Мартин Смит
-4

Чтобы исключить системные базы данных:

SELECT name FROM master.dbo.sysdatabases where sid <>0x01
Лука
источник
Это исключило большую часть моей базы данных.
Джефф
Почему вы добавляете предложение where? Это исключит системные базы данных, ОП не требует этого. И в следующий раз, если вы добавите ответ, объясните, что делает запрос. И рядом с этим нет sidего столбца на sys.databasesстоле егоowner_sid
Джорди ван Эйк