在SQL Server中重命名存储过程

时间:2009-09-03 20:22:23

标签: sql sql-server sql-server-2008

我正在尝试使用sp_rename系统sproc重命名SQL Server 2008中的存储过程。第三个参数虽然给我带来了困难,但我仍然收到以下错误:

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

正如消息所示,我正在传递P参数的值。我这样称呼sproc:

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

我仔细检查了文档,其中说这是来自sys.objects的值。我跑了以下来仔细检查我是不是疯了

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

确实返回的类型是P.

有谁知道我应该在这里传递什么?我不想把它留空,因为我正在创建一个通用的sproc来重命名任意的sprocs,如果sproc和其他东西之间有名称冲突,我不想担心。< / p>

9 个答案:

答案 0 :(得分:48)

只需省略@objtype参数(默认值为null)即可。

EXEC sp_rename 'sp_MyProc', 'sp_MyProcName'

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

  

警告:更改任何部分   对象名称可能会破坏脚本和   存储过程。

与其他人一样,您应该放弃并重新创建该程序。

答案 1 :(得分:17)

根据docs,'P'不是正确的选择。你应该尝试'OBJECT',因为这似乎是你想要做的最接近的事情。但是,你应该注意这个警告......

  

更改对象名称的任何部分   可以破解脚本并存储   程序。我们建议你不要   使用此语句重命名存储   程序,触发器,用户定义   功能或观点;相反,放弃   对象并使用new重新创建它   名。

另外(来自同一MSDN页):

  

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

答案 2 :(得分:2)

sp_rename不支持程序:

  

更改用户创建的名称   当前数据库中的对象。这个   对象可以是表,索引,列,   别名数据类型或Microsoft .NET   框架公共语言运行时   (CLR)用户定义类型

只需使用相同的正文和新名称创建新程序,然后删除旧程序。

答案 3 :(得分:1)

我不确定@objtype变量,但是我知道通过sp_rename重命名是不好的。

创建存储过程时,sys.objects中存在一个记录,存储过程的定义将存储在sys.sql_modules中。

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

最好的解决方案是放弃和放弃。重新创建

答案 4 :(得分:0)

在SQL 2000天中,DROP / CREATE更安全 - 用于在使用sp_rename时让proc的元数据不同步的SQL。

了解如何做类似花式DDL的最佳方法是在连接探查器跟踪时使用SSMS重命名对象。

答案 5 :(得分:0)

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

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

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

有关详细信息,请访问。

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/

答案 6 :(得分:0)

Valentino Vranken所说的都是真的。但请记住,当您删除并创建存储过程时,会丢失所有元数据。 (Create_Date,Modify_Date等)

  

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

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

我想知道SSMS接口如何在不使用T-SQL的情况下自动完成所有这些操作。 (每次使用界面重命名SP时,它可能会运行一个更改脚本吗?我不知道。)当你进行SSMS重命名时,MS会发布幕后发生的事情会很有趣。

答案 7 :(得分:0)

  • 当您想重命名一个时,需要第三个参数(GL_INVALID_OPERATION) 存储过程以外的数据库对象。否则是 必须传递第三个参数。例如重命名列 使用 sp_rename 看起来像这样。

    @objtype
  • 要使用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重命名这些对象类型。而是拖放并使用新名称重新创建对象。

重命名表或列之类的对象不会自动重命名对该对象的引用。您必须手动修改任何引用重命名对象的对象。例如,如果重命名表列并且该列在触发器中被引用,则必须修改触发器以反映新的列名。重命名对象之前,请使用sp_rename列出对象的依赖关系。

您可以在这里阅读有关内容:sp_rename (Transact-SQL)

答案 8 :(得分:0)

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

  1. 删除和重新创建过程:问题在于,这将导致权限丢失。
  2. 过程的sp_rename:权限将保持不变。存储过程将被重命名。但是,sys.sql_modules仍将具有旧的定义。

我更喜欢第二种方法。我按照以下步骤操作:

  1. 具有存储过程内容的副本
  2. 重命名存储过程
EXEC sp_rename 'dbo.OldStoredProcedureName','NewStoredProcedureName'
GO
  1. ALTER PROCEDURE sys.sql_modules
  2. 中具有该过程的修改后的代码
ALTER PROCEDURE dbo.NewStoredProcedureName
...

现在,存储过程名称也已更新,并且在sys.sql_modules中刷新了代码,权限也保持不变。