Here is a query that does a few things:
column_name = c.name,
type_name = t.name,
'alter table ' +
quotename(object_schema_name(c.object_id)) + '.' +
' alter column ' + quotename(c.name) +
from sys.columns c
inner join sys.types t
on c.system_type_id = t.system_type_id
where c.name = 'UserID'
--and c.max_length = 9;
You can uncomment that last line (the AND clause for the filtering) to just pull the columns in your database that are varchar(9).
So this query will identify the columns that you are concerned with, as well as the last column for the query's result set will be the
ALTER TABLE ... ALTER COLUMN DDL that should be the T-SQL text to make the column alteration.
It sounds like this may be a non-production environment/database, but it is worth saying that this operation could be extremely invasive to actually make all these changes. Either way, make sure end-users will have minimal impact, and also make sure you have a valid backup of this database before you do it. Likewise, review the output of the query. Never just take output, especially DDL-generating output, and blindly execute it.
EDIT: I completely missed the portion of your question where your requirement is also to add the column if it doesn't exist. Apologies there, and I won't redo Aaron's work, as it looks like he already covered that requirement.