No puede usar variables, como @tableName, en DDL. Además, dividir el nombre en partes e ignorar el esquema solo puede generar errores. Solo debe usar el reemplazo ''?'' en el parámetro de lote de SQL y confiar en MSforeachtable
reemplazo:
EXEC sp_MSforeachtable '
if not exists (select * from sys.columns
where object_id = object_id(''?'')
and name = ''CreatedOn'')
begin
ALTER TABLE ? ADD CreatedOn datetime NOT NULL DEFAULT getdate();
end';