Vous ne pouvez pas faire cela sans le SQL dynamique car une procédure stockée doit être dans son propre lot. Par conséquent, vous ne pouvez pas dire :
IF <some condition>
<start a new batch>
La seule façon de conserver cela dans le même lot est d'utiliser sp_executesql
.
Si vous allez scripter le DROP
et CREATE
simultanément, faites-le simplement sans vérifier l'existence de l'objet. Cela vous donnera :
DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Qui se soucie si le DROP
échoue? (Cela ne devrait pas être le cas, car vous venez de créer un script à partir de celui-ci !)
Si vous écrivez ceci pour un autre système qui pourrait avez l'objet, vous obtiendrez un message d'erreur pour le DROP
quand ce n'est pas le cas, mais le CREATE
se produira toujours, vous pouvez donc ignorer le DROP
les erreurs. Si vous le souhaitez vraiment, vous pouvez envelopper manuellement le DROP
instructions dans TRY/CATCH
mais je ne pense pas que ce soit nécessaire.
Si vous avez besoin de le faire pour un grand nombre de procédures, ou si vous avez vraiment besoin que le processus ne génère pas d'erreurs bénignes, je vous suggère d'abandonner les options de script primitives de Management Studio et d'utiliser un outil tiers pour cela. Ils auront déjà traité de nombreux problèmes que vous n'avez pas encore rencontrés, mais ils le feront. J'ai blogué à ce sujet :
http:// bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/