I did set it to after registration before so member ID was generated for anyone who registered. However, this means if a user is not approved by the committee the member ID will be 'wasted' and there will be gap in the member ID of the active/approved members. My client's policy is they will give membership ID only to approved member.
So technically, yes, executing the SQL after registration works and guarantees correct details sent out in the Welcome email. It's just that the workflow doesn't suit the business policy so I had to find another way