Отримайте список баз даних із 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
— Chris Diver

4
EXE sp_databases повільно виконувався для мене; 40 секунд на екземплярі з 36 базами даних. Вибір із системних баз даних був миттєвим.
— MarcE

10
Щоб розширити те, що сказав @ChrisDiver: ВИБІРТЕ ім'я від 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');

і додати назви баз даних служб звітування


53

Для виключення системних баз даних:

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

Відредаговано: 14:36 ​​2/5/2013

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

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

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'); 

Деякі назви системних баз даних (ресурс, дистрибутив, сервіс звітів, reportservicetempdb) просто вставити їх у запит. Якщо у вас за замовчуванням є вказані вище db-адреси.


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

Це працюватиме як для обох умов, чи ввімкнено звітність, чи ні


1
Обережно, якщо ваш сервер є іменованим екземпляром, імена db ReportServer схожі на ReportServer $ InstanceName та ReportServer $ InstanceNameTempDB. Отже, це буде працювати в будь-якому випадку: SELECT [ім'я] ВІД 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 2008/2012/2014. Більшість запитів надходить із збереженої процедури " sp_databases ". Я видаляю лише непотрібний стовпчик і додаю там, де умови.



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]

-1

можливо я додо!

show databases; працював на мене.


14
Не в SQL Server
— Мартін Сміт

1
моя відповідь мені знову допомогла. #blessed
— thedanotto

ця команда працювала і для мене, інший результат навіть той, який набрав 528 голосів, не працював.
— Брано

-4

У SQL Server 2008 R2 це працює:

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

І перелічити лише бази даних, створені користувачами.


10
Редагувати: Це так неправильно! owner_sid=1означає saвласника, нічого особливого в цьому немає.
— wqw

-4

Ви можете знайти всі назви бази даних за допомогою цього: -

 select name from sys.sysdatabases

2
Не додає нічого за відповіді, опубліковані роками раніше
— Мартін Сміт

-4

Для виключення системних баз даних:

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

Це виключило більшість моєї бази даних.
— Джефф

Чому ви додаєте пункт де? Це виключить системні бази даних, ОП цього не просить. А наступного разу, якщо ви додасте відповідь, поясніть, що робить запит. А поруч із цим sidстовпця на sys.databasesстолі немаєowner_sid
— Джорді ван Ейк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.