2009-03-04 72 views
9

我将表导出到服务器,但找不到表。也许我没有把正确的目标数据库。如果我的服务器有多个数据库,而不打开它们中的每一个,我怎么能找到这个表?跨多个数据库查找表SQL SERVER 2005

我使用MS SQL Server Management Studio中2008

回答

13

粗糙和肮脏,但它会做的工作。

-- 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' 
+1

+1使用sp_MSforeachdb,我不知道。 – cdonner 2009-03-04 13:59:51

+0

这是当你发现两年的SQL Server支持可以有用:) – 2009-03-04 14:02:17

1
select 'select * from '+name+'.sys.tables where name= 
     ''[yourtable]'';' from sys.databases 

相反[yourtable]中,键入缺少的表的名称,并再次运行结果。

1
EXEC sp_MSForEachDB ' 
USE ? 
IF OBJECT_ID(''mytable'') IS NOT NULL AND 
    OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1 
    PRINT ''?'' 
' 
2

小澄清只是为了避免这些麻烦与 '超级用户' 谁不知道如何命名DBS:

EXEC sp_MSForEachDB ' 
USE [?] 
IF OBJECT_ID(''mytable'') IS NOT NULL AND 
    OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1 
PRINT ''Found here: ?''' 
+0

所以你逃过了数据库名称。好电话 – 2011-03-19 21:04:32

5

一种方式

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 
3

基于关闭马丁·史密斯的回答以上,但概括为一个观点给予了几分SYS.TABLES的跨数据库的版本 - 现在

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) 

,如果只有我能制定出一个办法做到相同的列.......

编辑 - 忽略这一点,发现它有时完全忽略表。