Получить список баз данных из SQL Server - PullRequest
325 голосов
/ 29 сентября 2008

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

Ответы [ 15 ]

524 голосов
/ 29 сентября 2008

Выполнить:

SELECT name FROM master.sys.databases

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


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

SELECT name FROM master.dbo.sysdatabases

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

EXEC sp_databases
77 голосов
/ 26 мая 2011

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

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

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

48 голосов
/ 29 сентября 2008

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

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

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

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

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4
26 голосов
/ 07 февраля 2011
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 

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

20 голосов
/ 08 августа 2011

Поскольку вы используете .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
15 голосов
/ 18 июля 2014

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

select * from sys.databases

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

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

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

5 голосов
/ 28 октября 2013
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'

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

3 голосов
/ 11 декабря 2013

Я использую следующий код Объекты управления 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();
}
1 голос
/ 14 сентября 2014

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

Если вы хотите опустить системные базы данных и таблицы 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 ". Я только удалил ненужный столбец и добавил, где условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...