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.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.
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
Como outros afirmaram, você deve desistir e recriar o procedimento.Atenção: o nome do objecto poderá quebrar os programas e procedimento.
sp_rename
não suporta os procedimentos:
Basta criar o novo procedimento com o mesmo corpo e novo nome, e depois largar o antigo.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.
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
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.
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.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.
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.
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/