• I was wrong in answering the question. But to me it seems that Procedure name 'GO' is not the cause of concern. If I put something like this

    CREATE PROC GOT AS BEGIN

    EXEC ('ALTER PROC GOT AS SELECT NULL')

    --EXEC GOT

    DROP PROC GOT

    END

    GO

    EXEC GOT

    As you see, if the second Exec statement is commented out then it doesn't throw the 'NULL', which means that the second execution result is what it shows up when the whole script is run. Also If just the last statment 'EXEC GO' is run twice for the script provided in the question then it throws the right error.

    Another point is that if you don't execute the last statement 'EXEC GO' , then you can see that the procedure still exists in the DB. So that exec statement is causing the procedure to live even after the drop statement.