【问题标题】:Joining sys.columns and sys.tables on database name在数据库名称上加入 sys.columns 和 sys.tables
【发布时间】:2016-10-19 04:36:41
【问题描述】:

我正在使用数据库后端编写应用程序,但我需要通过 SQL 找出所有列名和它们所属的表。我知道您可以查询sys.columnssys.tablessys.databases,但我想要将它们全部加入以获得类似以下结果(基本上显示数据库中的所有列和表):

    +-----------+------------+
    | Tablename | columnname |
    +-----------+------------+
    | Table1    | Id         |
    | Table1    | Name       |
    | Table1    | Owner      |
    | Table2    | Id         |
    | Table2    | Name       |
    | Table2    | True       |
    +-----------+------------+

我仔细查看了 sys 架构,但在 sys.columnssys.tables 中找不到任何父引用。

【问题讨论】:

    标签: sql-server database join


    【解决方案1】:

    Randy Minder's 答案是最正确的。但如果您想继续使用 sys.columns 和 sys.tables,请在 object_id 上加入它们。

    select   tab.name, col.name
    from    sys.columns col
    inner join sys.tables tab
        on col.object_id = tab.object_id
    

    您可以使用它自己从 sys.columns 表中获取表名。

    select object_name(object_id),name 
    from sys.columns
    

    【讨论】:

      【解决方案2】:

      您通常不想直接查询 sys.columns 或 sys.tables(或任何系统表)。您应该使用 INFORMATION_SCHEMA 视图。这些视图是查询系统表的 ANSI 标准方法,这些表可能会随着版本的不同而变化。 INFORMATION_SCHEMA 视图不会改变,至少不会改变。

      SELECT COLUMN_NAME,* 
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = <TableName> AND TABLE_SCHEMA= <SchemaName>
      

      当然,WHERE 子句在这里是可选的,可以省略以查看所有表中的所有列等。

      【讨论】:

      • 好吧,INFORMATION_SCHEMA 当你有很多表时很慢(像这样的查询在我的数据库上大约需要 30 秒,我有大约 1800 个表 - 其中一半以上是由错误创建的,这就是为什么我们注意到了——对 sys.columns 的查询几乎是即时的)。是的,我知道,这不是真正的“一般”情况,仅供参考:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多