Non puoi farlo senza l'SQL dinamico perché una procedura memorizzata deve trovarsi nel proprio batch. Quindi non puoi dire:
IF <some condition>
<start a new batch>
L'unico modo per mantenerlo nello stesso batch è usare sp_executesql
.
Se hai intenzione di creare uno script di DROP
e CREATE
contemporaneamente, fallo senza il controllo dell'esistenza dell'oggetto. Questo ti darà:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Chi se ne frega se il DROP
non riesce? (Non dovrebbe, perché hai appena creato uno script da esso!)
Se stai eseguendo lo script per un altro sistema che potrebbe hai l'oggetto, riceverai un messaggio di errore per il DROP
quando non lo fa, ma il CREATE
accadrà comunque, quindi puoi ignorare il DROP
errori. Se vuoi davvero puoi avvolgere manualmente il DROP
istruzioni in TRY/CATCH
ma non credo sia necessario.
Se è necessario eseguire questa operazione per molte procedure o se è davvero necessario che il processo non generi errori benigni, suggerisco di abbandonare le opzioni di scripting primitivo di Management Studio e di utilizzare uno strumento di terze parti per questo. Avranno già affrontato molti dei problemi che non hai ancora incontrato, ma lo faranno. Ho bloggato su questo:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/