【问题标题】:SQL Server - Querying sysobjectsSQL Server - 查询系统对象
【发布时间】:2011-06-29 13:38:32
【问题描述】:

我注意到,当我查询 dbo.sysobjects 以确定数据库中的所有对象时,它还会选取名称以“syncobj_”开头的所有系统视图。它们的 xtype 为“V”,似乎没有任何方法可以知道这些是系统视图,而不是我自己的,除非通过检查视图的名称。还有其他方法吗?我想从我正在创建的查询中排除这些。

【问题讨论】:

  • 您可能想查看此 SO Q/A:stackoverflow.com/questions/2910077/…
  • 您使用的是什么版本的 SQL Server?这可能会影响您获得的回复的有效性或质量。例如,如果您使用的是 2005+,则有比 sysobjects 更好的答案。建议使用确切(或最低)版本进行标记(例如标记“sql-server-2008”)。
  • @Aaron - 如果我想要数据库中所有对象的完整列表,还有什么比 sysobjects 更好的选择?我知道我可以使用信息模式视图,但是我需要查询其中的十几个。使用 2008 年。
  • sys.objects 优于 sysobjects。后者是仍然存在于产品中的兼容性视图,只是因为必须更改的代码量。以后应该使用目录视图,而不是兼容性视图。

标签: sql-server tsql sql-server-2008


【解决方案1】:

OBJECTPROPERTY:

IsMSShipped

任何模式范围的对象

在安装 SQL Server 期间创建的对象。 1 = 真 0 = 假

像这样使用它:

SELECT * from sysobjects where OBJECTPROPERTY(ID,N'IsMSShipped') = 0

虽然它的文档有点偏离 - 它还可以帮助您排除稍后“由”SQL Server 添加的其他对象 - 例如。任何与复制相关的对象也被视为IsMSShipped

【讨论】:

    【解决方案2】:

    尝试类似:

    select *
    from sysobjects
    where name NOT IN (
        select name from sys.system_views
    )
    

    【讨论】:

    • 实际使用 object_id 可能更好。 select * from sysobjects where id NOT IN ( select object_id from sys.system_views )
    • 记得加入你的桌子。 select * from sysobjects where id NOT IN (select object_id from sys.system_views where sysobjects.id = object_id) 或者更好的是,使用存在。
    • 这仍然允许系统表和其他对象通过。
    • @t-clausen.dk 虽然公认是最佳实践,虽然我在很多情况下更喜欢 EXISTS,但只有当 NOT IN 返回的值可以为 NULL 时才真正需要引用。由于 sys.system_views.object_id 不是 NULLable,我无法想象非相关子查询会产生无效结果的场景。
    【解决方案3】:

    由于您使用的是 SQL Server 2008,因此几乎没有理由继续使用过时的兼容性视图 sysobjects。您应该改用 SQL Server 2005 中引入的目录视图 sys.objects。另外,您不需要为每一行调用外部 OBJECTPROPERTY() 函数,因为它包含一个名为 is_ms_shipped 的列,它揭示了相同的信息。

    SELECT OBJECT_SCHEMA_NAME([object_id]), name, type
     FROM sys.objects
     WHERE is_ms_shipped = 0;
    

    【讨论】:

    • 请注意,这仍然会返回一些系统对象,例如dtproperties 表(如果您将图表支持添加到数据库则添加)不被认为是 MS 提供的,而是一个用户表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多