在SQL SERVER 2005中跨多个数据库查找表

9

我将一张表导出到服务器,但是我找不到这张表。可能是我没有放到正确的目标数据库中。如果我的服务器有多个数据库,我该如何找到这张表而不需要逐个打开每个数据库?

我使用的是MS Sql Server Management Studio 2008。

6个回答

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'

这就是你发现两年的SQL Server支持有用的时候 :) - Diego

7

一种方式

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 

好主意,谢谢。将其泛化为一个视图并保存,正是我所需要的! - eftpotrm
@eftpotrm - 啊,我现在有一个比这更好的方法。这里是链接 - Martin Smith
谢谢 - 我最终得到了一个稍微不同的需求,所以我认为那不会完全适合我。可惜 :-) 我马上会把我的答案添加进来。 - eftpotrm

3

基于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)

现在,如果我能找到一种方法来处理列的话,那就太好了......编辑-不要理会这个,有时会完全错过表格。

2

为了避免那些不知道如何命名数据库的“超级用户”头疼,这里做一点小澄清:

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

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 ''?''
'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接