我正在尝试使用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>
答案 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
不推荐使用此存储过程,因为它会在内部破坏事务并可能在以后导致异常结果。因此,这很糟糕。微软必须说的是:重命名存储过程,函数,视图或触发器将不会在
Microsoft, DB experts (and others here as well)
目录视图的定义列中或使用sys.sql_modules
内置函数获得的相应对象的名称更改。因此,我们建议不要使用OBJECT_DEFINITION
重命名这些对象类型。而是拖放并使用新名称重新创建对象。重命名表或列之类的对象不会自动重命名对该对象的引用。您必须手动修改任何引用重命名对象的对象。例如,如果重命名表列并且该列在触发器中被引用,则必须修改触发器以反映新的列名。重命名对象之前,请使用
sp_rename
列出对象的依赖关系。
您可以在这里阅读有关内容:sp_rename (Transact-SQL)
答案 8 :(得分:0)
有两种重命名存储过程的方法。
sys.sql_modules
仍将具有旧的定义。我更喜欢第二种方法。我按照以下步骤操作:
EXEC sp_rename 'dbo.OldStoredProcedureName','NewStoredProcedureName'
GO
ALTER PROCEDURE
在sys.sql_modules
ALTER PROCEDURE dbo.NewStoredProcedureName
...
现在,存储过程名称也已更新,并且在sys.sql_modules
中刷新了代码,权限也保持不变。