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.

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

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


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

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


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

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.


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


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();
}

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.



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]

-1

może jestem dodo!

show databases; pracował dla mnie.


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.


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

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

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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.