Pobierz listę baz danych z SQL Server

381

Jak mogę uzyskać listę dostępnych baz danych w wystąpieniu programu SQL Server? Planuję zrobić ich listę w polu kombi w VB.NET.

sef
źródło

Odpowiedzi:

614

Wykonać:

SELECT name FROM master.sys.databases

To preferowane podejście jest teraz raczej dbo.sysdatabasesprzestarzałe.


Wykonaj to zapytanie:

SELECT name FROM master.dbo.sysdatabases

lub jeśli wolisz

EXEC sp_databases
Ben Hoffstein
źródło
5
@Gia Istnieje jako widok zgodności z poprzednimi wersjami. msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Chris Diver,
4
EXEC sp_databases był dla mnie powolny ; 40 sekund w instancji z 36 bazami danych. Wybieranie z sysdatabases było natychmiastowe.
MarcE
10
Aby rozwinąć to, co powiedział @ChrisDiver: WYBIERZ nazwę z sys.databases jest teraz preferowanym podejściem, a nie dbo.sysdatabase, które jest przestarzałe od dekady.
Micheasza
3
Przynajmniej na SQL Server 2014 exec sp_databasesnie działał. Pozostałe dwa ( master.dbo.sysdatabasesi sys.databases) nadal działają.
r2evans
86

w świetle niejasności co do liczby baz danych niebędących użytkownikami, prawdopodobnie należy dodać:

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

i dodaj nazwy baz danych usług raportowania

GilShalit
źródło
53

Aby wykluczyć systemowe bazy danych:

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

Zmieniano: 14:36 ​​2/5/2013

Zaktualizowany o dokładny id_bazy_danych, powinien być większy niż 4, aby pominąć wyświetlanie baz systemowych, które mają identyfikator bazy danych od 1 do 4.

SELECT * 
FROM sys.databases d
WHERE d.database_id > 4
GilM
źródło
7
To nie działa. Może miałeś na myśli> 4? Tabele 5 i 6 są tabelami użytkowników.
Outside the Box Developer
1
Wygląda na to, że zawsze powinno być> 4, chociaż serwer, który sprawdzam, ma „ReportServer” i „ReportServerTempDB” w pozycjach 5 i 6.
Trisped
dla mnie> 6 zrobiłoby.
Robb_2015,
27
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 

Działa na naszym SQL Server 2008

Szczery
źródło
Systemowe bazy danych z ID5 i 6 będą ReportServeri ReportServerTempDBjeśli masz SQL Server Reporting Serviceszainstalowane.
Charles Hepner
22

Ponieważ używasz platformy .NET, możesz używać obiektów zarządzania 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
źródło
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,
Wątpię, czy (localhost) jest odczytywany z jakiegoś pliku konfiguracyjnego. Nie mogłem go uruchomić z moim „moim hostem” (który jest moją poprawną nazwą hosta, powiedzmy uzyskaną przez Environment.MachineName). Czy to zadziała, jeśli zastąpię „localhost” słowem „myhost”?
Ajeeb.KP
19

Nie myl się, użyj poniższego prostego zapytania, aby uzyskać wszystkie bazy danych,

select * from sys.databases

Jeśli potrzebujesz tylko baz danych zdefiniowanych przez użytkownika;

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

Niektóre z nazw Systemowej bazy danych to (zasób, dystrybucja, usługa raportów, usługa raportów), wystarczy wstawić ją do zapytania. Jeśli masz powyższe bazy danych na swoim komputerze jako domyślne.

Balaji
źródło
7
SELECT [name] 
FROM master.dbo.sysdatabases 
WHERE dbid > 4 and [name] <> 'ReportServer' and [name] <> 'ReportServerTempDB'

Będzie to działać w obu przypadkach, niezależnie od tego, czy raportowanie jest włączone, czy nie

ManiG
źródło
1
Ostrożnie, jeśli serwer jest nazwanym wystąpieniem, nazwy db ReportServer są podobne do ReportServer $ InstanceName i ReportServer $ InstanceNameTempDB. Tak, to działałoby w obie strony: WYBIERZ [nazwa] Z master.dbo.sysdatabases GDZIE dbid> 4 i [nazwa] NIE LUBI 'ReportServer%'
ToddK
5

Korzystam z następującego kodu SQL Server Management Objects, aby uzyskać listę baz danych, które nie są bazami systemowymi i nie są migawkami.

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
źródło
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();lub foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases)jak w .NET 4.0 + SQL Server 2014 lub .SqlServer.Smo \ 12.0.0.0
Robb_2015
2

Jeśli chcesz pominąć systemowe bazy danych i tabele ReportServer (jeśli są zainstalowane):

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

Działa to na Sql Server 2008/2012/2014. Większość zapytań pochodzi z procedury przechowywanej w systemie „ sp_databases ”. Usuwam tylko niepotrzebną kolumnę i dodałem gdzie warunki.

Tarık Özgün Güner
źródło
1

W SQL Server 7 dbid 1 do 4 to systemowe dbs.

JerryOL
źródło
1

Nie jestem pewien, czy to pominie bazy danych serwera raportów, ponieważ nie działam, ale z tego, co widziałem, mogę pominąć bazy danych użytkowników systemu za pomocą tego kodu 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
źródło
-1

może jestem dodo!

show databases; pracował dla mnie.

thedanotto
źródło
14
Nie w programie SQL Server
Martin Smith,
1
moja odpowiedź znów mi pomogła. #blessed
thedanotto
to polecenie również działało dla mnie, inny wynik nawet ten z 528 głosami nie działał.
Brano
-4

W SQL Server 2008 R2 działa to:

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

Wymień tylko bazy danych utworzone przez użytkowników.

saper_2
źródło
10
Edycja: To takie złe! owner_sid=1oznacza sawłaściciela, nic specjalnego.
wqw
-4

Możesz znaleźć wszystkie nazwy baz danych za pomocą: -

 select name from sys.sysdatabases
David Sam
źródło
2
Nie dodaje niczego w stosunku do odpowiedzi opublikowanych wiele lat wcześniej
Martin Smith,
-4

Aby wykluczyć systemowe bazy danych:

SELECT name FROM master.dbo.sysdatabases where sid <>0x01
Luca
źródło
Wykluczyło to większość mojej bazy danych.
Jeff
Dlaczego dodajesz klauzulę where? Wyklucza to systemowe bazy danych, PO nie prosi o to. A następnym razem, jeśli dodasz odpowiedź, wyjaśnij, co robi zapytanie. A obok tego nie ma sidkolumny na sys.databasesstoleowner_sid
Jordy van Eijk,