【问题标题】:How to get a list of all tables in two different databases如何获取两个不同数据库中所有表的列表
【发布时间】:2011-09-27 22:15:08
【问题描述】:

我正在尝试创建一个小 SQL 脚本(在 SQL Server Management Studio 中)来获取两个不同数据库中所有表的列表。目标是找出哪些表存在于两个数据库中,哪些表只存在于其中一个中。

我在 SO 上找到了各种脚本来列出 one 数据库的所有表,但到目前为止我无法获得多个数据库的表列表。

那么:有没有办法在 SQL Server 中查询特定数据库中的所有表,例如SELECT * FROM ... WHERE databaseName='first_db' 以便我可以将其与另一个数据库的结果结合起来?

【问题讨论】:

    标签: sql-server database-schema


    【解决方案1】:
    SELECT * FROM database1.INFORMATION_SCHEMA.TABLES
    UNION ALL
    SELECT * FROM database2.INFORMATION_SCHEMA.TABLES
    

    更新

    为了比较这两个列表,您可以使用FULL OUTER JOIN,它将显示两个数据库中存在的表以及仅存在于其中一个数据库中的表:

    SELECT *
    FROM database1.INFORMATION_SCHEMA.TABLES db1
      FULL JOIN database2.INFORMATION_SCHEMA.TABLES db2
        ON db1.TABLE_NAME = db2.TABLE_NAME
    ORDER BY COALESCE(db1.TABLE_NAME, db2.TABLE_NAME)
    

    您还可以添加WHERE db1.TABLE_NAME IS NULL OR db2.TABLE_NAME IS NULL 以仅查看数据库之间的差异。

    【讨论】:

    • +1 很酷,我可以发誓这行不通!甚至可以使用特定于 SQL Server 的db1.sys.tables
    【解决方案2】:

    据我所知,您只能查询活动数据库的表。但是你可以将它们存储在一个临时表中,然后加入结果:

    use db1
    insert #TableList select (...) from sys.tables
    use db2
    insert #TableList2 select (...) from sys.tables
    select * from #TableList tl1 join Tablelist2 tl2 on ...
    

    【讨论】:

      【解决方案3】:

      为了完整起见,这是我最后使用的查询(基于 Andriy M 的回答):

      SELECT * FROM DB1.INFORMATION_SCHEMA.Tables db1
        LEFT OUTER JOIN DB2.INFORMATION_SCHEMA.Tables db2
          ON db1.TABLE_NAME = db2.TABLE_NAME
        ORDER BY db1.TABLE_NAME
      

      要找出哪些表存在于 db2 中,但不存在于 db1 中,请将 LEFT OUTER JOIN 替换为 RIGHT OUTER JOIN

      【讨论】:

      • 是的,要找出两者,您可以改用FULL OUTER JOIN
      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2021-06-21
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多