2009-07-30 2 views
3

SQL Server 데이터 사전에 지나치게 익숙하지 않지만 가능한 작업을 수행 할 수 있다고 가정했습니다. 클라이언트 1 클라이언트 2 Client3SQL Server 데이터 사전을 쿼리하여 'x'테이블을 포함하는 모든 데이터베이스를 찾습니다.

오히려 명명 규칙에 의존하는 것보다, 나는 그들이 키를 포함하는지 여부에 따라 이러한 데이터베이스를 식별하기 위해 기대했다 : 다른 이름 말에서

우리는 복제 된 데이터베이스의 번호를 가지고 테이블, MyTable 전화. 그래서 다음이 필요했던 같은 쿼리를 생각하기 시작 : 내가 직접 또는 간접적으로하려면 sys.databases하는 sys.tables에 가입하는 방법을 볼 수 없기 때문에,이 작동하지 않습니다

SELECT db.name 
FROM sys.databases db 
JOIN sys.tables tbl ON ?? 
WHERE tbl.Name = 'MyTable' 

을, 또한 sys.tables 모든 데이터베이스에 대한 완전한 테이블 세트가 아닌 사용중인 데이터베이스를 기반으로 한 뷰입니다.

누구든지이 상황에 적합한 쿼리를 식별 할 수 있습니까?

답변

5

문서화되지 않은 sp_MSforeachdb

EXECUTE master.sys.sp_MSforeachdb 
'select table_catalog from 
information_schema.tables where table_name like ''MyTable%''' 

쿼리가 동적으로

(여기에 표준 동적 SQL 경고/승인을 삽입) 선택 문을 작성하는 것입니다로 할 마음에 오는 유일한 방법을 시도
Declare @SQL varchar(max) 
    Set @SQL = '' 
    Select @SQL = @SQL + Coalesce('Select Distinct 
    table_catalog from ' + name + '.information_schema.tables 
    where table_name like ''mytable%'' UNION ','') 
    from sys.databases where state_desc = 'ONLINE' 
    and collation_name = 'SQL_Latin1_General_CP1_CI_AS' 
    set @SQL = Substring(@SQL, 1, Len(@SQL) - 6) + ' order by table_catalog ' 
    exec (@SQL) 

* 참고 사용 가능한 데이터베이스의 상태 및 데이터 정렬에 대한 몇 가지 기준을 추가했습니다.

+3

+1 단일 쿼리 결과가 필요했기 때문에 아래에 맞게 수정되었습니다. 다른 사람이 있다면 순수한 쿼리 응답을 원합니다. 표 #ClientDbs에게 ( 이름 varchar (최대) ) master.sys.sp_MSforeachdb '사용을 EXECUTE를 만드시겠습니까? INSERT INTO #ClientDbs 는 INFORMATION_SCHEMA.TABLES FROM 을 TABLE_CATALOG SELECT WHERE TABLE_NAME LIKE '프로파일' ' SELECT *를 #ClientDbs DROP 표 #ClientDbs FROM – MattH

관련 문제