Het probleem is dat wanneer u meerdere rijen invoegt, u dezelfde volgende beschikbare ID voor alle rijen gebruikt, u moet ROW_NUMBER()
toevoegen in om er zeker van te zijn dat de xid uniek was in de insert:
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];
Met betrekking tot het voorkomen van duplicaten kunt u tabelhints gebruiken om xtable
te vergrendelen bij het verkrijgen van de maximale xid
.
Het nadeel van het gebruik van deze sloten is dat je vastloopt. U zou een unieke beperking/index voor deze kolom moeten hebben, omdat dit duplicaten zal voorkomen, maar het zal ook leiden tot uitzonderingen wanneer aan een race-voorwaarde wordt voldaan. Welke methode je ook kiest, je zult uiteindelijk een offer moeten brengen.