Nie można tego zrobić bez dynamicznego SQL, ponieważ procedura składowana musi znajdować się we własnej partii. Dlatego nie możesz powiedzieć:
IF <some condition>
<start a new batch>
Jedynym sposobem na zachowanie tego w tej samej partii jest użycie sp_executesql .
Jeśli zamierzasz napisać skrypt DROP i CREATE jednocześnie, po prostu zrób to bez sprawdzania istnienia obiektu. To da ci:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Kogo to obchodzi, jeśli DROP zawodzi? (Nie powinno, ponieważ właśnie z niego napisałeś skrypt!)
Jeśli piszesz to dla innego systemu, może masz obiekt, otrzymasz komunikat o błędzie dla DROP kiedy nie, ale CREATE nadal się wydarzy, więc możesz zignorować DROP błędy. Jeśli naprawdę chcesz, możesz ręcznie zawinąć DROP instrukcje w TRY/CATCH ale myślę, że nie jest to konieczne.
Jeśli musisz to zrobić w przypadku wielu procedur lub jeśli naprawdę potrzebujesz, aby proces nie generował łagodnych błędów, sugeruję porzucenie opcji prymitywnych skryptów Management Studio i użycie do tego narzędzia innej firmy. Zajmą się już wieloma problemami, z którymi jeszcze się nie spotkałeś, ale to zrobią. Pisałem o tym na blogu:
https:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/