I assume that if any columns in you transtable does not have a badvalue it is left alone.
Then instead of using a cursor which has too many round trips (1 for each row) to the DB, try doing it in a single statement. Since you have 100 columns it will not be pretty. Something like:
update transtable set (col1,col2,col3,...,col100) =
(coalesce(mt1.goodvalue,col1),coalesce(mt2.goodval ue,col2,coalesce(mt3.goodvalue,col3,...,coalesce(m t100.goodvalue,col100))
from transtable
left outer join mastertable as mt1 on (col1 = mt1.badvalue)
left outer join mastertable as mt2 on (col2 = mt2.badvalue)
left outer join mastertable as mt3 on (col3 = mt3.badvalue)
.
.
.
left outer join mastertable as mt100 on (col100 = mt100.badvalue)
HTH
Andy