Yo uso esto:
begin tran;
update ... where ... ;
if @@rowcount = 0
insert ...
commit tran;
Según tengo entendido, con los índices adecuados en su lugar, la actualización coloca bloqueos de rango adecuados que evitarían que otros inserten lo mismo al mismo tiempo.