Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

mantenendo una colonna di incremento automatico personalizzata

Il problema è che se hai più righe inserite stai usando lo stesso ID disponibile successivo per tutte le righe, dovresti aggiungere ROW_NUMBER() in per garantire che xid fosse univoco nell'inserto:

insert into [xtable] (XID)
select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) [NextavailableID]
  from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
) [x];

Per quanto riguarda la prevenzione dei duplicati, puoi utilizzare i suggerimenti della tabella per bloccare xtable quando ottieni il massimo xid .

Lo svantaggio dell'utilizzo di questi blocchi è che si verificherà un deadlock. Dovresti avere un vincolo/indice univoco su questa colonna in quanto ciò eviterà duplicati, tuttavia comporterà anche eccezioni quando viene soddisfatta una race condition. Alla fine, qualunque metodo tu scelga, dovrai fare una sorta di sacrificio.