• Regarding CREATE vs. ALTER...maybe it is just personal taste, but I don't mind--or maybe even like--the two different commands.  We are not just declaring a procedure (or a function, or a view, or whatever), but we are explicitly creating an object in the database.  Once there is an object in the database, it should not change unless we explicitly want it to change.

    For the same reason that I am glad SQL gives us separate INSERT and UPDATE statements for rows, I'm glad it gives us CREATE and ALTER for objects.

    Yes, sometimes an 'upsert' is handy--and there are ways to do that if needed.  But since dropping and re-creating objects is not without side effects (such as loosing permissions, loosing asymmetric keys, executing DDL triggers, triggering a re-compile of the object, changing the object id, etc.) it is possibly dangerous to be in the mindset that a DROP + CREATE produces the same results as an ALTER.