Не можете да направите това без динамичния SQL, защото съхранената процедура трябва да бъде в собствена партида. Следователно не можете да кажете:
IF <some condition>
<start a new batch>
Единственият начин да го запазите в една и съща партида е да използвате sp_executesql
.
Ако ще скриптирате DROP
и CREATE
едновременно, просто го направете без проверка за съществуване на обект. Това ще ви даде:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
На кого му пука дали DROP
не успява? (Не трябва, защото току-що сте написали скрипт от него!)
Ако скриптирате това за друга система, която може ако имате обекта, ще получите съобщение за грешка за DROP
когато не е така, но CREATE
все пак ще се случи, така че можете да игнорирате DROP
грешки. Ако наистина искате, можете ръчно да обвиете DROP
изрази в TRY/CATCH
но не мисля, че е необходимо.
Ако трябва да направите това за много процедури или ако наистина имате нужда от процеса да не генерира доброкачествени грешки, предлагам ви да изоставите примитивните опции за скриптове на Management Studio и да използвате инструмент на трета страна за това. Те вече ще са се справили с много от проблемите, които все още не сте срещали, но ще се сблъскат. Написах в блог за това:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/