【问题标题】:Wrong return value of OBJECT_ID?OBJECT_ID 的返回值错误?
【发布时间】:2016-11-09 10:02:24
【问题描述】:

在 Microsoft SQL Server 2014 (SP2-CU1) (KB3178925) 上 - 12.0.5511.0 (X64) 2016 年 8 月 19 日 14:32:30 版权所有 (c) 微软公司 Windows NT 6.1(Build 7601:Service Pack 1)(Hypervisor)上的企业版(64 位)

由于 sp_UpdateStats 实际上不存在,查询:

SELECT OBJECT_ID('sp_UpdateStats')

返回值:-838816646

select * FROM sys.objects WHERE name='sp_UpdateStats'

返回 0 行...

怎么可能? OBJECT_ID 函数中的错误?

编辑

很高兴知道 ID -838816646 来自 sys.sysobjects 或 sys.system_objects 但更准确的问题是:

  • 为什么该过程出现在 sys.sysobjects 和 sys.system_objects 中,而不是出现在应该是我们应该使用的新视图的 sys.objects 中?

【问题讨论】:

  • 来自fine manual:“此视图有一个具有相同架构的版本,称为sys.system_objects,它显示系统对象。还有另一个视图称为sys.all_objects,它同时显示系统和用户对象。所有三个目录视图都具有相同的结构。” sp_updatestats 是一个系统对象。
  • 您似乎认为您的计算机上不存在sp_updatestats。确实如此。你不可能丢弃它,因为系统对象不能被丢弃,除非使用可怕的黑魔法。
  • 是的,但问题的标题是“OBJECT_ID 的返回值错误?”所以有趣的是“理解”从哪里来的 ID -838816646,但真正的问题是,显然,由于数据库中不存在该过程,因此 OBJECT_ID 的返回值是错误的......所以函数是不可靠的 ?这是一个错误吗?
  • sp_ 是为系统存储过程保留的前缀。切勿将它用于您自己的程序,因为它会导致 a performance hit 并且可能会破坏希望看到系统程序而不是您的程序的应用程序。
  • 好的,感谢您提供的有用的最终精度。

标签: sql sql-server tsql ssms


【解决方案1】:

它将存储在Master数据库sysobjects视图中

select * FROM master.sys.sysobjects WHERE name='sp_UpdateStats'

结果:-838816646

【讨论】:

  • 确实在那里 sys.sysobjects ......但我不明白是不是应该贬值那个并被 sys.objects 取代?为什么它会出现在 sys.sysobjects 中,因为该过程已被删除?这是向后兼容“旧”表的错误吗?
【解决方案2】:

使用sys.all_objects 包含系统对象。

SELECT *
FROM   sys.all_objects
WHERE  NAME = 'sp_UpdateStats' 

对此的定义实际上在资源数据库中。

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 2019-02-03
    • 2014-01-16
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多