Eu uso isso:
begin tran;
update ... where ... ;
if @@rowcount = 0
insert ...
commit tran;
Pelo que entendi, com os índices adequados, a atualização coloca os bloqueios de intervalo adequados que impediriam que outras pessoas inserissem a mesma coisa simultaneamente.