Проблемът е, че когато вмъквате няколко реда, използвате един и същ следващ наличен идентификатор за всички редове, трябва да добавите ROW_NUMBER()
в, за да се гарантира, че xid е уникален във вмъкването:
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];
По отношение на предотвратяването на дублиране можете да използвате съвети за таблица, за да заключите xtable
при получаване на максималния xid
.
Недостатъкът на използването на тези ключалки е, че ще получите блокиране. Трябва да имате уникално ограничение/индекс в тази колона, тъй като това ще предотврати дублирането, но също така ще доведе до изключения, когато е изпълнено условие за състезание. В крайна сметка, какъвто и метод да изберете, ще трябва да направите някаква жертва.