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.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 분 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은 될 것입니다 ReportServer및 ReportServerTempDB당신이 경우 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.