Bez dynamického SQL to nemůžete udělat, protože uložená procedura musí být ve své vlastní dávce. Proto nemůžete říci:
IF <some condition>
<start a new batch>
Jediný způsob, jak to udržet ve stejné dávce, je použít sp_executesql
.
Pokud se chystáte skriptovat DROP
a CREATE
současně to prostě udělejte bez kontroly existence objektu. To vám dá:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Koho zajímá, jestli DROP
selže? (Nemělo by, protože jste z něj právě vytvořili skript!)
Pokud to skriptujete pro jiný systém, možná mít objekt, zobrazí se chybová zpráva pro DROP
když ne, ale CREATE
bude stále probíhat, takže DROP
můžete ignorovat chyby. Pokud opravdu chcete, můžete ručně zabalit DROP
příkazy v TRY/CATCH
ale nemyslím si, že je to nutné.
Pokud to potřebujete udělat pro mnoho procedur nebo pokud opravdu potřebujete, aby proces negeneroval neškodné chyby, doporučuji vám opustit možnosti primitivního skriptování Management Studio a použít k tomu nástroj třetí strany. Už se vypořádali s mnoha problémy, se kterými jste se ještě nesetkali, ale budou. Napsal jsem o tom blog:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/