Du kan ikke gøre dette uden den dynamiske SQL, fordi en lagret procedure skal være i sin egen batch. Derfor kan du ikke sige:
IF <some condition>
<start a new batch>
Den eneste måde at holde det i samme batch er at bruge sp_executesql
.
Hvis du vil scripte DROP
og CREATE
samtidigt, bare gør det uden kontrol for objektets eksistens. Dette vil give dig:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Hvem bekymrer sig om DROP
fejler? (Det burde den ikke, for du har lige skrevet et script ud fra det!)
Hvis du scripter dette til et andet system, måske har objektet, får du en fejlmeddelelse for DROP
når den ikke gør det, men CREATE
vil stadig ske, så du kan ignorere DROP
fejl. Hvis du virkelig vil, kan du manuelt indpakke DROP
udsagn i TRY/CATCH
men jeg tror ikke det er nødvendigt.
Hvis du har brug for at gøre dette for mange procedurer, eller hvis du virkelig har brug for processen for ikke at generere godartede fejl, foreslår jeg, at du opgiver Management Studios primitive scripting muligheder og bruger et 3. parts værktøj til dette. De vil allerede have behandlet mange af de problemer, du endnu ikke er stødt på, men vil. Jeg bloggede om dette:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/