sys.objects [name]列与定义中的对象名称不一致(存储过程名称)

时间:2016-07-11 09:51:48

标签: sql sql-server stored-procedures sysobjects

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

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

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

只是想知道,有没有办法检索实际的对象名称(在这种情况下,SP名称)?

2 个答案:

答案 0 :(得分:0)

我有类似的情况,其中使用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用于表/列以外的对象。

答案 1 :(得分:0)

我遇到了同样的问题。看来SP_RENAME没有更新对象定义。从sp_rename链接,microsoft说:

  

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