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/ko-kr/library/ms179900%28v=SQL.110%29.aspx
Chris Diver

4
EXEC sp_databases가 느리게 실행되었습니다. 36 개의 데이터베이스가있는 인스턴스에서 40 초 sysdatabases에서 즉시 선택했습니다.
MarcE

10
@ChrisDiver가 말한 것을 확장하려면 : SELECT name FROM sys.databases는 현재 10 년 동안 더 이상 사용되지 않는 dbo.sysdatabases보다 선호되는 접근 방식입니다.
Micah

3
적어도 SQL Server 2014에서는 exec sp_databases작동하지 않았습니다. 다른 두 개 ( master.dbo.sysdatabasessys.databases)는 여전히 작동합니다.
r2evans

86

비 사용자 데이터베이스의 수에 대한 모호성을 고려하여 다음을 추가해야합니다.

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

보고 서비스 데이터베이스의 이름을 추가하십시오.


53

시스템 데이터베이스를 제외하려면 다음을 수행하십시오.

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

편집 : 오후 2시 36 분 2/5/2013

정확한 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보다 커야합니다.
Trisped

나를 위해> 6은 할 것입니다.
Robb_2015

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

SQL Server 2008에서 작동


와 시스템 데이터베이스 ID5와 6은 될 것입니다 ReportServerReportServerTempDB당신이 경우 SQL Server Reporting Services설치.
Charles Hepner

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

의심의 여지가 있지만 (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'); 

시스템 데이터베이스 이름 중 일부 (자원, 배포, 보고서 서비스, 보고서 서비스 템플릿)는 쿼리에 삽입합니다. 만약 당신의 머신에 위의 db가 기본값으로 있다면.


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

이는보고 사용 여부에 관계없이 두 가지 조건 모두에서 작동합니다.


1
서버가 명명 된 인스턴스 인 경우 ReportServer db 이름은 ReportServer $ InstanceName 및 ReportServer $ InstanceNameTempDB와 같습니다. 따라서 다음 중 한 가지 방법으로 작동합니다. SELECT [name] FROM master.dbo.sysdatabases WHERE dbid> 4 및 [name] 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();
}

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();또는 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 "시스템 저장 프로 시저 에서옵니다 . 불필요한 열만 제거하고 위치를 추가했습니다.


1

SQL Server 7에서 dbid 1 ~ 4는 시스템 db입니다.


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]

-1

아마도 나는 도도 야!

show databases; 나를 위해 일했다.


14
SQL Server에 없음
Martin Smith

1
내 대답은 다시 나를 도왔습니다. #blessed
thedanotto

이 명령은 나에게도 효과가 있었고 528 표를 얻은 결과조차도 효과가 없었습니다.
브라 노

-4

SQL Server 2008 R2에서는 다음과 같이 작동합니다.

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

그리고 사용자가 만든 데이터베이스 만 나열하십시오.


10
편집 : 이것은 너무 잘못입니다! 소유자를 owner_sid=1의미하며 sa특별한 것은 없습니다.
wqw

-4

다음을 사용하여 모든 데이터베이스 이름을 찾을 수 있습니다.

 select name from sys.sysdatabases

2
몇 년 전에 게시 된 답변에 대해서는 아무것도 추가하지 않습니다
Martin Smith

-4

시스템 데이터베이스를 제외하려면 다음을 수행하십시오.

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

이것은 대부분의 데이터베이스를 제외했습니다.
Jeff

where 절을 추가하는 이유는 무엇입니까? 이것은 시스템 데이터베이스를 제외하고 OP는 이것을 요구하지 않습니다. 그리고 다음에 답변을 추가하면 쿼리의 기능을 설명하십시오. 그리고 어떤이 있음을 옆에 sid온 그 열 sys.databases테이블의owner_sid
Jordy 반 Eijk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.