SQL Server'dan veritabanlarının listesini alma


381

Bir SQL Server örneğindeki kullanılabilir veritabanlarının listesini nasıl edinebilirim? Bunların bir listesini VB.NET'te bir birleşik giriş kutusunda yapmayı planlıyorum.

Yanıtlar:


614

Yürütme:

SELECT name FROM master.sys.databases

Bir dbo.sysdatabasessüredir kullanımdan kaldırılmış olan bu, şimdi tercih edilen yaklaşımdır .


Bu sorguyu yürütün:

SELECT name FROM master.dbo.sysdatabases

ya da isterseniz

EXEC sp_databases

5
@Gia Geriye dönük uyumluluk görünümü olarak mevcuttur. msdn.microsoft.com/en-us/library/ms179900%28v=SQL.110%29.aspx
Chris Diver

4
EXEC sp_databases benim için yürütmek yavaş ; 36 veritabanına sahip bir örnek üzerinde 40 saniye. Sysdatabases arasından seçim anında yapıldı.
MarcE

10
@ChrisDiver'in söylediklerini genişletmek için: on yıldan beri kullanımdan kaldırılan dbo.sysdatabases yerine, sys.databases'den SELECT name tercih edilen yaklaşımdır.
Micah

3
En azından SQL Server 2014'te exec sp_databasesçalışmadı. Diğer ikisi ( master.dbo.sysdatabasesve sys.databases) hala çalışıyor.
r2evans

86

kullanıcı olmayan veritabanı sayısının belirsizliği ışığında şunları eklemelisiniz:

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

ve raporlama hizmetleri veritabanlarının adlarını ekleyin


53

Sistem veritabanlarını hariç tutmak için:

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

Düzenlendi: 14:36 ​​14.02.2013

Doğru database_id ile güncellendi, 1 ve 4 arasında veritabanı kimliğine sahip sistem veritabanlarının listelenmesini atlamak 4'ten büyük olmalıdır.

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

7
Bu çalışmıyor. Belki de> 4? Tablo 5 ve 6 kullanıcı tablolarıdır.
Kutu Geliştiricisi Dışında

1
Her zaman> 4 olması gerektiği gibi görünüyor, ancak kontrol ediyorum sunucu 5 ve 6 konumda "ReportServer" ve "ReportServerTempDB" vardır.
Aralık'ta Trisped

benim için> 6 yapardı.
Robb_2015

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

SQL Server 2008 üzerinde çalışır


Sistem veritabanları ID5 ve 6 olacak ReportServerve ReportServerTempDBsen varsa SQL Server Reporting Servicesyüklü.
Charles Hepner

22

.NET kullandığınız için SQL Server Yönetim Nesneleri'ni kullanabilirsiniz.

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

Şüphesiz, (localhost), bazı yapılandırma dosyasından okunur. Benim "myhost" ile çalışamadım (ki benim doğru ana bilgisayar adı, demek. Environment.MachineName tarafından elde edilen). "Localhost" yerine "myhost" yerine bu çalışma?
Ajeeb.KP

19

Kafanız karışmasın, tüm veritabanlarını almak için aşağıdaki basit sorguyu kullanın,

select * from sys.databases

Sadece kullanıcı tanımlı veritabanlarına ihtiyacınız varsa;

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

Sistem veritabanı adlarından bazıları (kaynak, dağıtım, rapor servisi, report_hizmeti) sadece sorguya ekleyin. U varsayılan olarak yukarıdaki db's makinenizde varsa.


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

Raporlama etkin olsun ya da olmasın, her iki koşul için de çalışır


1
Sunucunuz adlandırılmış bir örnekse, ReportServer db adları ReportServer $ InstanceName ve ReportServer $ InstanceNameTempDB gibidir. Bu nedenle, her iki şekilde de çalışır: [name] master.dbo.sys veritabanlarından NEREDEN dbid> 4 ve [name] 'ReportServer%' GİBİ
SEÇMEYİN SEÇİN

5

Sistem veritabanları olmayan ve anlık görüntüler olmayan veritabanlarının bir listesini almak için aşağıdaki SQL Server Yönetim Nesneleri kodunu kullanıyorum.

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

bir 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();veya foreach (var Db in new Microsoft.SqlServer.Management.Smo.Server("localhost").Databases).NET 4.0 + SQL Server 2014 veya .SqlServer.Smo \ 12.0.0.0
Robb_2015

2

Sistem veritabanlarını ve ReportServer tablolarını (yüklenmişse) atlamak istiyorsanız:

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

Bu Sql Server 2008/2012/2014 üzerinde çalışır. Sorgunun çoğu " sp_databases " sistem saklı yordamından gelir. Sadece gereksiz sütunu kaldırdım ve koşullar nereye eklendi.



1

Emin değilim ben bir çalıştırmıyorum beri Rapor sunucusu veritabanlarını atlayacak, ama ne gördüm, ben bu SQL ile sistem kullanıcı sahibi veritabanları atlayabilirsiniz:

    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

belki ben bir dodo'yum!

show databases; benim için çalıştı.


14
SQL Server'da değil
Martin Smith

1
cevabım bana tekrar yardımcı oldu. #blessed
thedanotto

bu komut benim için de çalıştı, 528 oyu olan başka sonuç bile işe yaramadı.
Brano

-4

SQL Server 2008 R2'de bu çalışır:

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

Ve sadece kullanıcılar tarafından oluşturulan veritabanlarını listeleyin.


10
Düzenleme: Bu çok yanlış! sahibi, bu konuda özel bir şey owner_sid=1anlamına gelir sa.
wqw

-4

Tüm veritabanı adlarını şu şekilde bulabilirsiniz: -

 select name from sys.sysdatabases

2
Yıllar önce yayınlanan cevaplar üzerine hiçbir şey
Martin Smith

-4

Sistem veritabanlarını hariç tutmak için:

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

Bu, veritabanımın çoğunu hariç tuttu.
Jeff

Where where yantümcesini neden ekliyorsunuz? Bu sistem veritabanlarını hariç tutacaktır, OP bunu istememektedir. Ve bir dahaki sefere cevap eklerseniz sorgunun ne yaptığını açıklayın. Ve yanında masanın sidüzerinde sütun yoksys.databasesowner_sid
Jordy van Eijk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.