【问题标题】:Find a table across multiple databases SQL SERVER 2005跨多个数据库查找表 SQL SERVER 2005
【发布时间】:2010-10-11 06:28:34
【问题描述】:

我将表导出到服务器,但找不到该表。也许我没有放置正确的目标数据库。如果我的服务器有多个数据库,而不打开每个数据库,如何找到此表?

我使用 MS Sql Server Management Studio 2008。

【问题讨论】:

    标签: sql-server tsql sql-server-2005 ssms


    【解决方案1】:

    粗糙又脏,但它可以胜任。

    -- 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 支持很有用的时候 :)
    【解决方案2】:

    一种方式

    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 - 啊,我现在有比这更好的方法。 Here's a link
    • 谢谢 - 我最终得到了一个稍微不同的要求,所以我认为这对我来说不太适用。可惜 :-) 马上添加我的答案。
    【解决方案3】:

    基于上面 Martin Smith 的回答,但概括为一个视图,以提供一种跨数据库版本的 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)
    

    现在,如果我能想出一种方法来对列做同样的事情就好了......

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

    【讨论】:

      【解决方案4】:

      为了避免让那些不知道如何命名数据库的“超级用户”感到头疼的小说明:

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

      【讨论】:

        【解决方案5】:
        select 'select * from '+name+'.sys.tables where name=
                ''[yourtable]'';' from sys.databases
        

        输入缺失表的名称,而不是 [yourtable],然后再次运行结果。

        【讨论】:

          【解决方案6】:
          EXEC sp_MSForEachDB '
          USE ? 
          IF OBJECT_ID(''mytable'') IS NOT NULL AND
             OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1
              PRINT ''?''
          '
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多