代码之家  ›  专栏  ›  技术社区  ›  Peter Oehlert

在SQL Server中重命名存储过程

  •  24
  • Peter Oehlert  · 技术社区  · 15 年前

    Msg 15249, Level 11, State 1, Procedure sp_rename, Line 75
    Error: Explicit @objtype 'P' is unrecognized.
    

    正如消息所示,我正在为参数的值传递一个P。我这样称呼存储过程:

    EXEC sp_rename @objName = @procName, @newname = @WrappedName, @objtype = 'P';
    

    我仔细检查了说明这是sys.objects的值的文档。我运行了以下程序来再次检查我是否疯了

    select * from sys.objects where name = 'MySprocName'
    

    7 回复  |  直到 13 年前
        1
  •  61
  •   Pierre-Alain Vigeant    15 年前

    只要省略@objtype参数(默认值为null),它就可以工作了。

    EXEC sp_rename 'sp_MyProc', 'sp_MyProcName'
    

    您将收到以下警告,但该过程将被重命名

    注意:更改设备的任何部分 存储过程。

    正如其他人所说,您应该删除并重新创建该过程。

        2
  •  19
  •   Valentino Vranken    13 年前

    根据 docs ,“P”不是正确的选项。你应该尝试“对象”,因为这似乎是最接近你要做的事情。但是,你应该注意这个警告。。。

    更改对象名称的任何部分 可以中断脚本并存储 程序。我们建议您不要这样做 使用此语句可以重命名存储的 过程、触发器、用户定义 功能或观点;相反,请放下 对象并使用新的 名称

    MSDN 页码):

    重命名存储过程、函数、视图或触发器不会 更改定义中相应对象名称的名称 sp_rename不能用于重命名这些对象类型。相反,放弃

        3
  •  1
  •   Remus Rusanu    15 年前

    sp_rename 不支持以下程序:

    对象在当前数据库中。这 表、索引、列、, 框架公共语言运行库 (CLR)用户定义的类型 .

        4
  •  1
  •   Jaimal Chohan    15 年前

    创建存储过程时,其记录存在于sys.objects中,存储过程的定义将存储在sys.sql_模块中。

    使用sp_rename只会更改sys.objects中的名称,而不会更改sys.sql_模块中的名称,因此您的定义将不正确。

    最好的解决办法是一滴&一滴;再现

        5
  •  1
  •   Tahir77667    5 年前
    • 第三个参数( @objtype 存储过程以外的数据库对象。否则就是这样 必须传递第三个参数。例如,重命名列 使用 sp_重命名 看起来像这样。

      USE AdventureWorks2012;  
      GO  
      EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';  
      GO
      
    • 使用重命名用户定义的存储过程 sp_rename ,你可以做这样的事情,它确实有效

    sp-rename

    • 无论如何 通过 Microsoft, DB experts (and others here as well)

    重命名存储过程、函数、视图或触发器不会更改 sys.sql_modules OBJECT_DEFINITION 内置功能。因此,我们建议: 不能用于重命名这些对象类型。相反,请删除并使用新名称重新创建对象。

    重命名对象(如表或列)不会自动重命名对该对象的引用。必须手动修改引用重命名对象的任何对象。例如,如果重命名表列并且该列在触发器中被引用,则必须修改触发器以反映新的列名。使用 sys.sql_expression_dependencies

    您可以在此处阅读: sp_rename (Transact-SQL)

        6
  •  1
  •   Venkataraman R    4 年前

    重命名存储过程有两种方法。

    1. sp_重命名过程:权限将保持不变。存储过程将被重命名。但是 sys.sql_modules

    我更喜欢第二种方法。我遵循以下步骤:

    1. 重命名存储过程
    EXEC sp_rename 'dbo.OldStoredProcedureName','NewStoredProcedureName'
    GO
    
    1. ALTER PROCEDURE sys.sql\u模块
    ALTER PROCEDURE dbo.NewStoredProcedureName
    ...
    

    现在,存储过程名称也会更新,代码也会在中刷新 sys.sql\u模块

        7
  •  0
  •   MatthewMartin muthu    15 年前

    在SQL 2000天中,删除/创建SQL更安全——当您使用sp_rename时,SQL用于让proc的元数据不同步。

    了解如何进行类似的DDL的最佳方法是在附加探查器跟踪时使用SSMS重命名对象。

        8
  •  0
  •   user1161391    10 年前

    瓦伦蒂诺·弗兰肯所说的都是真的。但是请记住,当您删除并创建存储过程时,您将丢失所有元数据。(创建日期、修改日期等)

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

    这也是事实。但是,我发现在重命名后运行alter脚本时,它会更正模块中定义中的名称。

    我想知道SSMS接口如何在不使用T-SQL的情况下自动完成所有这些工作。(也许每次使用该界面重命名SP时,它都会运行alter脚本?我不知道。)有趣的是,当您执行SSMS重命名时,MS会发布幕后发生的事情。

        9
  •  -1
  •   Nimish goel    7 年前

    sp_rename仅更改数据库中用户创建的对象的名称 . 重命名存储过程不会更改sys.sql_modules目录视图的definition列中相应对象名称的名称。

    因此,我们建议您不要重命名此对象类型。相反,请删除存储过程并使用其新名称重新创建它。 即使您不应该使用它来重命名以更改视图、函数或触发器的名称。 如果您尝试使用,它将对其进行重命名,但您也会收到一些类似以下内容的警告消息:

    更改对象名称的任何部分都可能中断脚本和存储过程。

    有关更多信息,请访问。

    http://onlyforcoder.blogspot.in/2017/11/sprename-where-to-use-where-not-to-use.html http://blog.sqlauthority.com/2008/08/26/sql-server-how-to-rename-a-column-name-or-table-name/