Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Apenas inserindo uma linha se ela ainda não estiver lá


E o padrão "JFDI"?
BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Sério, isso é o mais rápido e simultâneo sem travas, especialmente em grandes volumes. E se o UPDLOCK for escalado e toda a tabela estiver travada?

Leia a lição 4:

Lição 4: Ao desenvolver o proc upsert antes de ajustar os índices, primeiro confiei que o If Exists(Select…) a linha seria acionada para qualquer item e proibiria duplicatas. Nada. Em pouco tempo havia milhares de duplicatas porque o mesmo item atingia o upsert no mesmo milissegundo e ambas as transações viam um não existe e executavam a inserção. Após muitos testes, a solução foi usar o índice exclusivo, detectar o erro e tentar novamente permitindo que a transação visse a linha e executasse uma atualização em vez de uma inserção.