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.