Du kan inte göra detta utan dynamisk SQL eftersom en lagrad procedur måste vara i sin egen batch. Därför kan du inte säga:
IF <some condition>
<start a new batch>
Det enda sättet att hålla det i samma batch är att använda sp_executesql
.
Om du ska skripta DROP
och CREATE
samtidigt, bara gör det utan kontrollen för objektets existens. Detta ger dig:
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Vem bryr sig om DROP
misslyckas? (Det borde det inte, för du skrev just från det!)
Om du skriptar detta för ett annat system som kan har objektet får du ett felmeddelande för DROP
när den inte gör det, men CREATE
kommer fortfarande att hända, så du kan ignorera DROP
fel. Om du verkligen vill kan du slå in DROP
manuellt uttalanden i TRY/CATCH
men jag tror inte att det är nödvändigt.
Om du behöver göra detta för många procedurer, eller om du verkligen behöver processen för att inte generera godartade fel, föreslår jag att du överger Management Studios primitiva skriptalternativ och använder ett tredjepartsverktyg för detta. De kommer redan att ha tagit itu med många av de problem du ännu inte har stött på, men kommer att göra det. Jag bloggade om detta:
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/