上周,作为一个要求的一部分,我编写了一个脚本来为所有数据库对象生成对象定义。
在测试时,我发现对于少数存储过程,[sys.objects] .name与实际对象定义中的名称不匹配(由OBJECT_DEFINITION(Object_ID)返回)。这很奇怪,我第一次看到它。
在考虑可能的原因时,我发现当我们从对象资源管理器(View - > SQL Server Management Studio中的对象资源管理器)重命名存储过程时会发生这种情况。
只是想知道,有没有办法检索实际的对象名称(在这种情况下,SP名称)?
答案 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重命名这些对象类型。而是使用新名称删除并重新创建对象。