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
EXEC sp_databasesの実行は時間かかりました。36個のデータベースがあるインスタンスで40秒。sysdatabasesからの選択は瞬時でした。
MarcE 2013年

10
@ChrisDiverの発言をさらに詳しく説明します。10年前から非推奨となっているdbo.sysdatabasesではなく、SELECT name FROM sys.databasesが推奨されるアプローチです。
2016

3
少なくともSQL Server 2014では機能exec sp_databasesしませんでした。他の2つ(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

編集:午後2:36 2013年2月5日

正確なdatabase_idで更新されました。データベースIDが1〜4のシステムデータベースのリストをスキップするには、4より大きい必要があります。

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

7
これは動作しません。たぶん> 4を意味しましたか?テーブル5と6はユーザーテーブルです。
ボックス開発者の外で

1
チェックしているサーバーの5と6の位置に "ReportServer"と "ReportServerTempDB"がありますが、常に> 4である必要があります。
2014

私にとって> 6はそうするでしょう。
Robb_2015

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

SQL Server 2008で動作します


システムデータベースID5と6は次のようになりますReportServerし、ReportServerTempDBあなたがしている場合はSQL Server Reporting Servicesインストールされています。
Charles Hepner、2011年

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 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'); 

一部のシステムデータベース名は(resource、distribution、reportservice、reportservicetempdb)で、クエリに挿入するだけです。上記のdbがマシンにデフォルトである場合。


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

これは、レポートが有効かどうかにかかわらず、両方の条件で機能します


1
サーバーが名前付きインスタンスの場合、注意してください。ReportServerのデータベース名は、ReportServer $ InstanceNameやReportServer $ InstanceNameTempDBのようになります。したがって、これはどちらの方法でも機能します。SELECT [name] FROM master.dbo.sysdatabases WHERE dbid> 4 and [name] NOT LIKE '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();
}

ワンライナー: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 Server 2008/2012/2014で動作します。ほとんどのクエリは " sp_databases "システムストアドプロシージャからのものです。不要な列を削除してwhere条件を追加しました。



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]


-4

SQL Server 2008 R2では、これは機能します。

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

また、ユーザーが作成したデータベースのみをリストします。


10
編集:これは間違っています!所有者をowner_sid=1意味しsa、特別なことは何もありません。
wqw 2012


-4

システムデータベースを除外するには:

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

これは私のデータベースのほとんどを除外しました。
ジェフ

なぜwhere句を追加するのですか?これはシステムデータベースを除外し、OPはこれを要求しません。次回、回答を追加する場合は、クエリの機能を説明してください。sidその隣にはsys.databasesテーブルにその列がありませんowner_sid
ジョルディ・ファン・アイク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.