Você não pode fazer isso sem o SQL dinâmico porque um procedimento armazenado precisa estar em seu próprio lote. Portanto, você não pode dizer:
IF <some condition>
<start a new batch>
A única maneira de manter isso no mesmo lote é usar
sp_executesql
. Se você for fazer o script do
DROP
e CREATE
simultaneamente, basta fazê-lo sem a verificação da existência do objeto. Isso lhe dará:DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Quem se importa se o
DROP
falha? (Não deveria, porque você acabou de criar um script a partir dele!) Se você estiver criando um script para outro sistema que pode tiver o objeto, você receberá uma mensagem de erro para o
DROP
quando não, mas o CREATE
ainda acontecerá, então você pode ignorar o DROP
erros. Se você realmente quiser, pode envolver manualmente o DROP
instruções em TRY/CATCH
mas não acho necessário. Se você precisar fazer isso para muitos procedimentos, ou se você realmente precisar que o processo não gere erros benignos, sugiro que você abandone as opções primitivas de script do Management Studio e use uma ferramenta de terceiros para isso. Eles já terão lidado com muitos dos problemas que você ainda não encontrou, mas o fará. Eu blogei sobre isso:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/