Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中重命名存储过程_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在SQL Server中重命名存储过程

在SQL Server中重命名存储过程,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试使用sp_rename system存储过程重命名SQL Server 2008中的存储过程。第三个参数给我带来了困难,我一直收到以下错误: Msg 15249, Level 11, State 1, Procedure sp_rename, Line 75 Error: Explicit @objtype 'P' is unrecognized. 正如消息所示,我正在为参数的值传递一个p。我这样称呼存储过程: EXEC sp_rename @objName = @procName,

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

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'
实际上,返回的类型是p

有人知道我应该通过这里吗?我不想将此字段留空,因为我正在创建一个通用存储过程来重命名任意存储过程,如果存储过程与其他存储过程之间存在名称冲突,我不想担心这一点。

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

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

另外(来自同一页):

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


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

EXEC sp_rename 'sp_MyProc', 'sp_MyProcName'
您将收到以下警告,但该过程将被重命名

注意:更改设备的任何部分 对象名称可能会中断脚本和 存储过程


像其他人所说的那样,您应该删除并重新创建过程。

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

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

不支持以下过程:

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


只需创建具有相同主体和新名称的新过程,然后删除旧过程。

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

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

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


最好的解决方案是删除并重新创建

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

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

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

有关更多信息,请访问


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

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

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

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

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

    USE AdventureWorks2012;  
    GO  
    EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';  
    GO
    
  • 要使用
    sp_rename
    重命名用户定义的存储过程,您可以执行类似的操作,它确实有效

  • 但是
    Microsoft、DB专家(以及这里的其他人)不建议使用此存储过程,因为它会在内部破坏内容,以后可能会产生异常结果。因此,它是不好的。以下是微软要说的:
重命名存储过程、函数、视图或触发器不会更改
sys.sql\u modules
目录视图的definition列中或使用
object\u definition
内置函数获得的相应对象的名称。因此,我们建议不要使用
sp_rename
重命名这些对象类型。相反,请删除并使用新名称重新创建对象

重命名对象(如表或列)不会自动