【问题标题】:sys.objects [name] column is not consistent with object name in definition (stored procedure name)sys.objects [name] 列与定义中的对象名称不一致(存储过程名称)
【发布时间】:2016-11-13 05:21:32
【问题描述】:

上周,作为一项要求的一部分,我编写了一个脚本来为所有数据库对象生成对象定义。

在测试时,我发现对于少数存储过程,[sys.objects].name 与实际对象定义中的名称不匹配(由 OBJECT_DEFINITION(Object_ID) 返回)。这很奇怪,我生平第一次看到它。

在考虑可能是什么原因时,我发现当我们从对象资源管理器(查看--> SQL Server Management Studio 中的对象资源管理器)重命名存储过程时会发生这种情况。

只是想知道,有没有办法检索实际的对象名称(在本例中为 SP 名称)?

【问题讨论】:

  • 请发布您使用的查询和您看到的实际差异
  • 简单查询。 SELECT OBJECT_DEFINITION(Object_ID), [name] FROM sys.objects where name = '{Object name}'

标签: sql sql-server stored-procedures sysobjects


【解决方案1】:

我也遇到过类似的情况,使用 sp_rename 重命名了存储过程。使用的新名称是迭代的,扩展名为 *_1。如果原始名称是“MyProcedure”,那么新名称将是“MyProcedure_1”。

'MyProcedure' 代表生产代码。 “MyProcedure_1”表示曾经是生产代码但现在已过时的代码。实际上,“MyProcedure_1”引用了数据库中不再存在的对象。

查看 sys.objects 中的名称时,带有扩展名的新名称存在 ('MyProcedure_1'),但 object_definition 返回旧名称 ('MyProcedure'),但代码为 'MyProcedure_1'。

这是通过调用“MyProcedure”发现的,但由于缺少对象而出错。

解决方案是 DROP 'MyProcedure_1',它有效地删除了 object_id 和错误的 object_definition,然后重新创建它。当然,我们必须解决丢失的对象。并且 - 我们对将 sp_rename 用于表/列以外的对象进行谨慎处理。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。 SP_RENAME 似乎没有更新对象定义。从 sp_rename 链接,微软说:

    重命名存储过程、函数、视图或触发器不会更改 sys.sql_modules 目录视图的定义列中或使用 OBJECT_DEFINITION 内置函数获得的相应对象的名称。 因此,我们建议不要使用 sp_rename 来重命名这些对象类型。而是使用新名称删除并重新创建对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多