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:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/