Mudar o nome de um procedimento armazenado no servidor SQL

estou a tentar mudar o nome de um procedimento armazenado no SQL Server 2008 com o sp_rename system sproc. O terceiro parâmetro está me dando dificuldade e continuo recebendo o seguinte erro:

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

Como a mensagem indica que estou a passar um P para o valor do parâmetro. Chamo o sproc assim:

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

verifiquei novamente a documentação que diz que este é o valor de sys.objecto. Corri o seguinte para confirmar que não ia. louco

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

e de facto o tipo devolvido é P.

Alguém sabe o que devo passar aqui? Eu não quero deixar este vazio desde que eu estou criando um sproc genérico para, entre outras coisas mudar o nome de sprocs arbitrários e se houver uma colisão de nome entre um sproc e algo mais eu não quero ter que se preocupar com isso.

Author: Peter Oehlert, 2009-09-04

7 answers

De acordo com o docs , 'P' não é uma opção correcta. Devias tentar "OBJECT" porque isso parece ser a coisa mais próxima do que estás a tentar fazer. Mas, você deve prestar atenção a este Aviso ...

Mudar qualquer parte de um nome de objecto pode quebrar os programas e guardar procedimento. Recomendamos que não usar esta declaração para mudar o nome do guardado procedimentos, gatilhos, definidos pelo utilizador funções ou vistas; em vez disso, largue a objectar e recriá-lo com o novo nome.

Also (from the same MSDN page):

Mudar o nome de um procedimento, função, vista ou trigger armazenados não irá alterar o nome do objecto correspondente na definição coluna do sistema.vista de catálogo sql_ modules. Portanto, recomendamos que o sp_ nome não seja usado para mudar o nome destes tipos de objectos. Em vez disso, largue e recriar o objecto com o seu novo nome.

 17
Author: JP Alioto, 2012-03-22 17:09:48

Basta omitir o parâmetro @objtype (o valor por omissão é nulo) e irá funcionar.

EXEC sp_rename 'sp_MyProc', 'sp_MyProcName'

Você receberá o seguinte aviso, mas o procedimento será renomeado

Atenção: o nome do objecto poderá quebrar os programas e procedimento.

Como outros afirmaram, você deve desistir e recriar o procedimento.
 40
Author: Pierre-Alain Vigeant, 2009-09-03 20:34:38

sp_rename não suporta os procedimentos:

Muda o nome de um utilizador criado objecto na base de dados actual. Presente o objecto pode ser uma tabela , Índice, coluna, tipo de dados alias, ou Microsoft. NET Framework common language runtime (CLR) tipo definido pelo utilizador.

Basta criar o novo procedimento com o mesmo corpo e novo nome, e depois largar o antigo.
 2
Author: Remus Rusanu, 2009-09-03 20:29:20

Não tenho a certeza sobre a variável @objtype, no entanto sei que mudar o nome via sp_rename é mau.

Quando se cria um proc armazenado, existe um registo no sys.os objetos e a definição do proc armazenado serão armazenados em sys.sql_modules.

Se usar o sp_rename só irá mudar o nome no sys.objectos, não em sys.sql_ modules assim a sua definição será incorreta.

A melhor solução é uma gota & recriar

 1
Author: Jaimal Chohan, 2009-09-03 20:34:14

Em sql 2000 dias, era mais seguro DROP / CREATE-- SQL usado para deixar os meta-dados para o proc sair do synch quando você usa o sp_rename.

A melhor maneira de descobrir como fazer um DDL chique como este é usar o SSMS para mudar o nome do objecto enquanto um traço de profiler é anexado.

 0
Author: MatthewMartin, 2009-09-03 20:27:30
Tudo o que Valentino Vranken disse é verdade. No entanto, tenha em mente que quando você cair e criar um procedimento armazenado, você perde todos os seus metadados. (Create_Date, Modify_ date etc.)

Mudar o nome de um procedimento, função, vista ou trigger armazenados não irá alterar o nome do objecto correspondente na coluna de definição do sistema.vista de catálogo sql_ modules. Portanto, recomendamos que o sp_rename não seja usado para renomear esses tipos de objetos. Em vez disso, drop e recriar o objecto com o seu novo nome.

Isto também é verdade. No entanto, descobri que quando você executa o script alter depois de fazer a renomeação, ele corrige o nome na definição nos Módulos.

Perguntei-me como é que a interface SSMS faz tudo isto automaticamente sem usar T-SQL. (Talvez ele executa um script alter cada vez que você renomeia um SP usando a interface? Não sei.) Seria interessante que a MS fosse publicar o que está acontecendo nos bastidores quando você faz um SSMS renomear.

 0
Author: user1161391, 2014-11-12 21:48:43

O Sp_ nome altera apenas o nome dos objectos criados pelo utilizador na base de dados . Mudar o nome de um procedimento armazenado não irá alterar o nome do objecto correspondente na coluna de definição do sistema.vista de catálogo sql_ modules.

Portanto, recomendamos que você não renomeie este tipo de objeto. Em vez disso, drop e recriar o procedimento armazenado com o seu novo nome. mesmo você não deve usá-lo para mudar o nome para mudar o nome da vista, função ou trigger. Se você vai tentar usar, ele vai renomeá-lo, mas você também vai receber alguma mensagem de aviso algo como isso:

Mudar qualquer parte de um nome de objecto pode quebrar os programas e os procedimentos armazenados.

Para mais informações, pode 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
Author: Nimish goel, 2017-11-13 15:55:17