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