【问题标题】:sys.columns shows details but table missing from sys.tablessys.columns 显示详细信息,但 sys.tables 中缺少表
【发布时间】:2015-01-22 15:25:42
【问题描述】:

我想知道某个列存在于数据库的哪个表中。所以我使用了带有 where 条件的 sys.columns,这给了我一些 object_id。

select * from sys.columns where name like 'mycol%'

接下来,我从上述查询中收到的 object_id 中查找该表的实际名称,如下来自 sys.tables。但是我的 select 语句返回一个空结果。这是否意味着数据库中不存在这样的表。如果是这样,sys.columns 如何告诉我我要查找的列位于具有此 object_id 的表中?

select * from sys.tables where object_id='584895884'

我使用的是 Microsoft SQL Server 2014。

【问题讨论】:

    标签: sql sql-server sql-server-2014


    【解决方案1】:

    这意味着它不是一个表,而是一个视图,或者一个表值函数,或者其他几种类型的对象之一。改用这个:

    SELECT *
    FROM sys.objects
    WHERE [object_id] = 584895884;
    

    请注意,[object_id] 字段是数字,而不是字符串,因此不应被引用。

    您也可以在单个查询中执行此操作:

    SELECT *
    FROM   sys.columns sc
    INNER JOIN sys.objects so
            ON so.[object_id] = sc.[object_id]
    WHERE sc.name LIKE N'mycol%';
    

    sys.objects 中的 typetype_desc 字段将指示该列所在的对象类型。我在我的一个数据库中看到的可能性是:

    type_desc(类型)


    CLR_TABLE_VALUED_FUNCTION (FT)
    INTERNAL_TABLE (IT)
    SQL_INLINE_TABLE_VALUED_FUNCTION (IF)
    SQL_TABLE_VALUED_FUNCTION (TF)
    SYSTEM_TABLE (S)
    TYPE_TABLE (TT)
    USER_TABLE (U)
    查看 (V)

    sys.tables 系统视图将只包含 U / USER_TABLE 类型的对象。

    【讨论】:

    • 非常感谢,它有效。 sys.tables 是否像仅包含 U / USER_TABLE 的 sys.objects 的子集? .我看到 sys.objects 包含您上面列出的许多类型。
    • @IAMTubby 是的,有很多特定于对象类型的系统视图,例如sys.viewssys.sql_modules(用于Procedures、Functions、Views,可能还有Triggers)等。但这些都是不仅仅是过滤了sys.objects 的视图;其中许多/大多数包含特定于该对象类型的附加或不同字段。查看SELECT * FROM sys.system_views; 的所有选项的结果。
    猜你喜欢
    • 2023-04-07
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多