Problemet är att om du har flera rader som infogas använder du samma nästa tillgängliga ID för alla rader, du måste lägga till ROW_NUMBER()
in för att säkerställa att xid var unikt i infogningen:
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];
När det gäller att förhindra dubbletter kan du använda tabelltips för att låsa xtable
när du får maximal xid
.
Nackdelen med att använda dessa lås är att du kommer att få låsning. Du bör ha en unik begränsning/index på den här kolumnen eftersom detta kommer att förhindra dubbletter, men det kommer också att resultera i undantag när ett tävlingsvillkor är uppfyllt. I slutändan, vilken metod du än väljer kommer du att behöva göra någon form av uppoffring.