sp_helptext 中过程的旧名称

use*_*299 4 sql-server stored-procedures

不久前ALF_GetPopulationForPolygon_2_old创建了该过程。然后在SSMS中,它被重命名(right mouse button -> rename)为 procedure ALF_GetPopulationForPolygon_2_old_FOR_DELETE_20170504。重命名正常通过,但是结果查询:

SELECT
    sm.definition
FROM
    sys.objects AS o
        INNER JOIN sys.sql_modules AS sm
        ON ( 1 = 1 )
           AND ( sm.object_id = o.object_id )
WHERE
    ( 1 = 1 )
    AND ( o.name like 'ALF_GetPopulationForPolygon_2_old_FOR_DELETE_20170504' )
Run Code Online (Sandbox Code Playgroud)

并调用存储过程:

EXEC sp_helpText 'ALF_GetPopulationForPolygon_2_old_FOR_DELETE_20170504'
Run Code Online (Sandbox Code Playgroud)

返回以下文本:

...
CREATE PROCEDURE [dbo]. [ALF_GetPopulationForPolygon_2]
...
Run Code Online (Sandbox Code Playgroud)

这些显示了过程的旧(!)名称。您知道这是由什么引起的吗?如何解决这个问题?

sep*_*pic 5

您不应该重命名对象,至少有两个原因。

如果您使用 T_SQL 命令而不是 GUI(您在 Management Studio 中“单击”的所有命令都会在幕后生成 T-SQL 代码),您会收到一条警告,与您在 BOL 文章中看到的内容相同: sp_rename (Transact -SQL)

小心 更改对象名称的任何部分都可能会破坏脚本和存储过程。我们建议您不要使用此语句来重命名存储过程、触发器、用户定义函数或视图;相反,删除该对象并使用新名称重新创建它。

这是反对更名的第一个原因。滚动文章找到备注部分:

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

这是第二次。

因此,当您想要重命名过程时,您应该将过程编写为 CREATE 并更改过程名称,这样做可以使用新名称重新创建过程,然后可以删除旧名称

  • 令人难以置信的是,这个错误被微软记录为功能(警告)。当然,重命名会破坏依赖关系,这是很明显的。但是,如果我重命名对象,则必须更新 *THIS* 对象的相应源代码。我今天花了几个小时在这个问题上:( (2认同)