Problém je v tom, že tam, kde se vkládá více řádků, používáte stejné další dostupné ID pro všechny řádky, budete muset přidat ROW_NUMBER()
in, aby bylo zajištěno, že xid bylo v vložení jedinečné:
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];
S ohledem na zamezení duplicit můžete použít tabulkové tipy k uzamčení xtable
při získání maximálního xid
.
Nevýhodou použití těchto zámků je, že dojde k zablokování. V tomto sloupci byste měli mít jedinečné omezení/index, protože to zabrání duplikacím, ale také to povede k výjimkám, když je splněna podmínka sporu. Nakonec, ať si zvolíte jakoukoli metodu, budete muset přinést nějakou oběť.