2009-09-03 18 views
18

Sto tentando di rinominare una stored procedure in SQL Server 2008 con sprocamma sp_rename. Il terzo parametro mi sta dando difficoltà e anche se continuo a ricevere il seguente errore:Rinominare una stored procedure in SQL Server

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

Come il messaggio indica che sto passando un P per il valore del parametro. Chiamo lo sProc in questo modo:

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

Ho ricontrollato la documentazione, che dice che questo è il valore da sys.objects. Ho eseguito il seguente a doppio controllo non stavo impazzendo

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

e in effetti il ​​tipo restituito è P.

Qualcuno sa cosa devo passare qui? Non voglio lasciare questo vuoto dal momento che sto creando uno sproc generico, tra le altre cose, rinominare gli sproc arbitrari e se c'è una collisione di nomi tra un sproc e qualcos'altro non voglio preoccuparmi di ciò.

risposta

17

In base allo docs, "P" non è un'opzione corretta. Dovresti provare 'OBJECT' in quanto sembra la cosa più vicina a ciò che stai cercando di fare. Ma, si dovrebbe prestare attenzione a questo avvertimento ...

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.

anche (dalla stessa MSDN pagina):

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

Grazie, ho letto che, ma in qualche modo ho perso il giusto valore che avevo bisogno di inserire. –

+0

Nota che il rilascio della procedura farà cadere tutte le autorizzazioni associate. Il modo migliore per rinominare è utilizzare sp_rename e quindi alterare proc per correggere sys_modules. – Boogier

36

basta omettere il parametro @objtype (il default è null) e funzionerà.

EXEC sp_rename 'sp_MyProc', 'sp_MyProcName' 

si riceverà il seguente avviso, ma la procedura sarà rinominato

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

Come altri hanno dichiarato, si dovrebbe eliminare e ricreare la procedura.

0

In SQL 2000 giorni, era più sicuro per DROP/CREATE-- SQL utilizzato per lasciare che i metadati per il proc venissero fuori sincrono quando si utilizza sp_rename.

Il modo migliore per scoprire come utilizzare il DDL di fantasia è utilizzare SSMS per rinominare l'oggetto mentre è collegata una traccia di profiler.

2

sp_rename non supporta procedure:

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.

Basta creare la nuova procedura con lo stesso corpo e il nuovo nome, quindi eliminare quello vecchio.

+1

Questo non è corretto. sp_rename ha funzionato specificando 'OBJECT' come @objtype. –

+5

@Peter: potrebbe non essere preciso al 100%, ma l'uso di sp_rename non è certamente raccomandato. _ "Rinominare una stored procedure, una funzione, una vista o un trigger non cambierà il nome del nome dell'oggetto corrispondente nella colonna di definizione della vista del catalogo sys.sql_modules, pertanto si consiglia di non utilizzare sp_rename per rinominare questi tipi di oggetto. Invece, rilasciare e ricreare l'oggetto con il suo nuovo nome. "_ (Da [MSDN] (http://msdn.microsoft.com/en-us/library/ms188351.aspx)) –

1

Non sono sicuro della variabile @objtype, tuttavia so che la ridenominazione tramite sp_rename è errata.

Quando si crea un processo memorizzato, esiste un record per esso in sys.objects e la definizione del processo memorizzato verrà archiviata in sys.sql_modules.

L'utilizzo di sp_rename cambierà solo il nome in sys.objects, non in sys.sql_modules, quindi la definizione sarà errata.

La soluzione migliore è una goccia & ricreare

+0

Per quello che sto facendo in realtà non importa. Sto facendo qualche iniezione in cui creo dinamicamente un proc in base alla definizione originale, rinominare l'originale in un nuovo nome, quindi chiamare l'originale dalla mia versione iniettata. Quando ho finito con la mia strumentazione, annullo il processo. –

0

sp_rename cambiare solo il nome di oggetti creati dall'utente nel database. Rinominare una stored procedure non cambierà il nome del nome dell'oggetto corrispondente nella colonna di definizione della vista del catalogo sys.sql_modules.

Pertanto, si consiglia di non rinominare questo tipo di oggetto. Invece, rilasciare e ricreare la stored procedure con il suo nuovo nome. anche non si dovrebbe usare per rinominare per cambiare il nome di vista, funzione o trigger. Se si tenta di utilizzare, verrà rinominato, ma verrà visualizzato anche un messaggio di avviso simile a questo:

La modifica di qualsiasi parte di un nome oggetto può interrompere script e stored procedure.

Per ulteriori informazioni è possibile visitare.

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

Tutto ciò che Valentino Vranken ha detto è vero. Tuttavia, tieni presente che quando si rilascia e si crea una stored procedure, si perdono tutti i metadati. (Create_Date, Modify_Date ecc.)

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.

Questo è anche vero. Tuttavia ho scoperto che quando si esegue lo script alter dopo aver effettuato la rinomina, corregge il nome nella definizione nei moduli.

Mi sono chiesto come l'interfaccia SSMS esegua tutto questo automaticamente senza utilizzare T-SQL. (Forse esegue un alter script ogni volta che si rinomina un SP utilizzando l'interfaccia? Non lo so.) Sarebbe interessante che MS pubblicasse ciò che accade dietro le quinte quando si rinomina un SSMS.

Problemi correlati