문제

테이블을 서버로 내보냈지 만 테이블을 찾을 수 없습니다. 어쩌면 올바른 대상 데이터베이스를 넣지 않았을 수도 있습니다. 내 서버가 여러 데이터베이스를 열지 않고 여러 데이터베이스가있는 경우이 테이블을 어떻게 찾을 수 있습니까?

MS SQL Server Management Studio 2008을 사용합니다.

도움이 되었습니까?

해결책

거칠고 더럽지 만 일을 할 것입니다.

-- Instructions. Replace "table_name_here" with actual table name
sp_MSforeachdb 'USE ?
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''[table_name_here]'') AND OBJECTPROPERTY(id, N''IsUserTable'') = 1)
BEGIN
  PRINT ''Found in db ?''
END'

다른 팁

일방 통행

SELECT  DISTINCT DB_NAME(database_id) 
FROM [sys].[dm_db_index_operational_stats](NULL,NULL,NULL,NULL)
WHERE OBJECT_NAME(object_id,database_id) = 'table_name'

또는 합리적으로 확신한다면 dbo 어떤 데이터베이스의 스키마

SELECT name
FROM   sys.databases
WHERE  CASE
         WHEN state_desc = 'ONLINE' 
              THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[table_name]', 'U')
       END IS NOT NULL 

위의 Martin Smith의 답변을 기반으로하지만 Sys.Tables의 일종의 크로스 DB 버전을 제공하기 위해 관점으로 일반화되었습니다.

CREATE VIEW ListTablesAllDBs

AS

SELECT 
    DB_NAME(database_id) as DBName,
    OBJECT_SCHEMA_NAME(object_id,database_id) as SchemaName,
    OBJECT_NAME(object_id,database_id) as TableName
FROM
    [sys].[dm_db_index_operational_stats](NULL,NULL,NULL,NULL)

이제, 열에 대해 똑같이 할 수있는 방법을 해결할 수 있다면 .......

편집 - 이것을 무시하고 때로는 테이블을 놓친다는 것을 알게됩니다.

DBS의 이름을 모르는 'Superusers'를 가진 사람들의 두통을 피하기 위해 사소한 설명 :

EXEC sp_MSForEachDB '
USE [?]
IF OBJECT_ID(''mytable'') IS NOT NULL AND
   OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1
PRINT ''Found here: ?'''
select 'select * from '+name+'.sys.tables where name=
        ''[yourtable]'';' from sys.databases

YourTable] 대신 누락 된 테이블의 이름을 입력하고 결과를 다시 실행하십시오.

EXEC sp_MSForEachDB '
USE ? 
IF OBJECT_ID(''mytable'') IS NOT NULL AND
   OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1
    PRINT ''?''
'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top