2009-09-03 111 views
18

我正嘗試使用sp_rename系統存儲過程重命名SQL Server 2008中的存儲過程。第三個參數給我帶來困難,但我仍然收到以下錯誤:重命名SQL Server中的存儲過程

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.

有誰知道我應該通過在這裏?我不想讓這個空,因爲我創建了一個通用的sproc來重命名任意sprocs,並且如果sproc和別的東西之間有名稱衝突,我不想擔心這一點。

回答

17

根據docs,'P'不是一個正確的選項。您應該嘗試'OBJECT',因爲這看起來與您正在嘗試做的事最接近。但是,你應該注意這個警告...

Changing any part of an object name can break scripts and stored procedures. We recommend you do not use this statement to rename stored procedures, triggers, user-defined functions, or views; instead, drop the object and re-create it with the new name.

而且(來自同一MSDN頁):

Renaming a stored procedure, function, view, or trigger will not change the name of the corresponding object name in the definition column of the sys.sql_modules catalog view. Therefore, we recommend that sp_rename not be used to rename these object types. Instead, drop and re-create the object with its new name.

+0

謝謝,我讀過,但不知何故錯過了我需要輸入的合適值。 – 2009-09-03 20:34:55

+0

請注意,刪除過程將刪除所有關聯的權限。重命名的最好方法是使用sp_rename,然後修改proc來糾正sys_modules。 – Boogier 2015-09-16 09:15:29

36

只是省略@objtype參數(默認爲空),它會工作。

EXEC sp_rename 'sp_MyProc', 'sp_MyProcName' 

您會收到以下警告,但程序將被重新命名

Caution: Changing any part of an object name could break scripts and stored procedures.

與其他人一樣說,你應該刪除並重新創建過程。

0

在SQL 2000的日子裏,DROP/CREATE_SOL更安全 - 當您使用sp_rename時,用於讓proc的元數據不同步。

找到如何做這種花哨的DDL的最好方法是使用SSMS在連接探查器跟蹤時重命名對象。

2

sp_rename不支持程序:

Changes the name of a user-created object in the current database. This object can be a table, index, column, alias data type, or Microsoft .NET Framework common language runtime (CLR) user-defined type.

只需創建新的程序具有相同的身體和新的名稱,然後刪除舊的。

+1

這是不正確的。 sp_rename通過將'OBJECT'指定爲@objtype來工作。 – 2009-09-03 20:34:11

+5

@Peter:它可能不是100%準確的,但使用sp_rename肯定不推薦。 _「重命名存儲過程,函數,視圖或觸發器不會更改sys.sql_modules目錄視圖定義列中相應對象名稱的名稱。因此,我們建議不要使用sp_rename重命名這些對象類型。而是使用新名稱刪除並重新創建該對象。「_(來自[MSDN](http://msdn.microsoft.com/zh-cn/library/ms188351.aspx)) – 2012-03-22 13:10:30

1

我不確定@objtype變量,但是我知道通過sp_rename重命名是不好的。

當您創建存儲過程時,sys.objects中會存在一條記錄,存儲過程的定義將存儲在sys.sql_modules中。

使用sp_rename只會更改sys.objects中的名稱,而不會更改sys.sql_modules中的名稱,因此您的定義將不正確。

最好的解決方案是一個下拉&重新

+0

我在做什麼它並不重要。我正在做一些注入,我根據原始定義動態創建一個proc,將原始文件重命名爲新名稱,然後從我的注入版本調用原始文件。當我完成我的儀器時,我撤消了這個過程。 – 2009-09-03 20:40:58

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/

0

所有華倫天奴Vranken說的是真的。但請記住,當您刪除並創建存儲過程時,會丟失所有元數據。 (Create_Date,Modify_Date等)

Renaming a stored procedure, function, view, or trigger will not change the name of the corresponding object name in the definition column of the sys.sql_modules catalog view. Therefore, we recommend that sp_rename not be used to rename these object types. Instead, drop and re-create the object with its new name.

這也是如此。但是,我發現在重命名後運行alter script時,它會更正模塊中定義的名稱。

我想知道SSMS接口如何在不使用T-SQL的情況下自動完成所有這些操作。 (也許每次使用界面重命名SP時,它都會運行一個更改腳本?我不知道)。MS將在發佈SSMS重命名後發生的事情時很有趣。