2009-09-03 42 views
18

Estoy intentando cambiar el nombre de un procedimiento almacenado en SQL Server 2008 con sproc del sistema sp_rename. El tercer parámetro es que me da dificultad y aunque no dejo de recibir el siguiente error:Cambiar el nombre de un procedimiento almacenado en SQL Server

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

A medida que el mensaje indica que estoy pasando un P para el valor del parámetro. Me llamo el sproc así:

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

que una doble comprobación de la documentación, que dice que este es el valor de sys.objects. Me encontré con la siguiente volver a comprobar que no iba loca

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

y de hecho el tipo devuelto es P.

¿Alguien sabe lo que debería pasar por aquí? No quiero dejar esto vacío ya que estoy creando un sproc genérico para, entre otras cosas, cambiar el nombre de scripts arbitrarios y si hay una colisión de nombre entre un sproc y otra cosa, no quiero tener que preocuparme por eso.

Respuesta

17

De acuerdo con docs, 'P' no es una opción correcta. Deberías probar con 'OBJECT' ya que parece ser lo más parecido a lo que intentas hacer. Sin embargo, se debe prestar atención a esta advertencia ...

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.

también (desde la misma página 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

Gracias, lo leí pero de alguna manera me perdí el valor correcto que necesitaba para ponerlo. –

+0

Tenga en cuenta que al abandonar el procedimiento se eliminarán todos los permisos asociados. La mejor manera de cambiar el nombre es usar sp_rename y luego modificar proc para corregir sys_modules. – Boogier

36

basta con omitir el parámetro @objtype (el valor predeterminado es nulo) y funcionará.

EXEC sp_rename 'sp_MyProc', 'sp_MyProcName' 

usted recibirá la siguiente advertencia, pero el procedimiento será renombrado

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

Como otros han dicho, debe eliminar y reconstruir el procedimiento.

0

En SQL 2000 días, era más seguro que DROP/CREATE-- SQL utilizado para permitir que los metadatos del proceso se desincronizaran cuando usa sp_rename.

La mejor manera de descubrir cómo hacer un DDL elegante es usar SSMS para cambiar el nombre del objeto mientras se adjunta una traza del perfilador.

2

sp_rename no admite procedimientos:

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 con crear el nuevo procedimiento con el mismo cuerpo y el nuevo nombre, a continuación, colocar el antiguo.

+1

Esto no es correcto. sp_rename funcionó especificando 'OBJECT' como @objtype. –

+5

@ Peter: puede que no sea 100% exacto, pero no se recomienda usar sp_rename. _ "Cambiar el nombre de un procedimiento almacenado, función, vista o desencadenador no cambiará el nombre del nombre de objeto correspondiente en la columna de definición de la vista de catálogo sys.sql_modules. Por lo tanto, recomendamos que sp_rename no se use para cambiar el nombre de estos tipos de objetos. En su lugar, suelte y vuelva a crear el objeto con su nuevo nombre. "_ (De [MSDN] (http://msdn.microsoft.com/en-us/library/ms188351.aspx)) –

1

No estoy seguro acerca de la variable @objtype, sin embargo, sí sé que el cambio de nombre a través de sp_rename es malo.

Cuando crea un proceso almacenado, existe un registro para él en sys.objects y la definición del proceso almacenado se almacenará en sys.sql_modules.

El uso de sp_rename solo cambiará el nombre en sys.objects, no en sys.sql_modules, por lo tanto, su definición será incorrecta.

La mejor solución es una gota & recrear

+0

Por lo que estoy haciendo en realidad no importa. Estoy haciendo algo de inyección donde creo dinámicamente un proceso basado en la definición original, renombro el original a un nuevo nombre y luego llamo al original de la versión inyectada. Cuando termine con mi instrumentación, deshago el proceso. –

0

sp_rename solamente cambiar el nombre de los objetos creados por el usuario en la base de datos de. Renombrar un procedimiento almacenado no cambiará el nombre del nombre de objeto correspondiente en la columna de definición de la vista de catálogo sys.sql_modules.

Por lo tanto, le recomendamos que no cambie el nombre de este tipo de objeto. En su lugar, suelte y vuelva a crear el procedimiento almacenado con su nuevo nombre. incluso si no debe usarlo use para cambiar el nombre para cambiar y cambiar el nombre de vista, función o desencadenador. Si intenta usar, lo cambiará de nombre, pero también recibirá un mensaje de advertencia como este:

Cambiar cualquier parte de un nombre de objeto puede romper las secuencias de comandos y los procedimientos almacenados.

Para obtener más información, puede visitar.

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

Todo lo que Valentino Vranken dijo es cierto. Sin embargo, tenga en cuenta que cuando suelta y crea un procedimiento almacenado, pierde todos sus metadatos. (Create_Date, Modify_Date etc.)

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.

Esto también es cierto. Sin embargo, descubrí que cuando ejecuta el script alter después de hacer el cambio de nombre, corrige el nombre en la definición en los módulos.

Me he preguntado cómo la interfaz SSMS hace todo esto automágicamente sin usar T-SQL. (¿Tal vez ejecuta un script alter cada vez que cambia el nombre de un SP utilizando la interfaz? No lo sé). Sería interesante que MS publicara lo que está sucediendo entre bastidores cuando hace un cambio de nombre SSMS.

Cuestiones relacionadas