Das Problem besteht darin, dass Sie beim Einfügen mehrerer Zeilen dieselbe nächste verfügbare ID für alle Zeilen verwenden und ROW_NUMBER()
hinzufügen müssten in, um sicherzustellen, dass die xid in der Einfügung eindeutig ist:
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];
Um Duplikate zu verhindern, können Sie Tabellenhinweise verwenden, um xtable
zu sperren beim Abrufen der maximalen xid
.
Der Nachteil bei der Verwendung dieser Sperren ist, dass Sie Deadlocks bekommen. Sie sollten eine eindeutige Einschränkung/einen eindeutigen Index für diese Spalte haben, da dies Duplikate verhindert, jedoch auch zu Ausnahmen führt, wenn eine Race-Bedingung erfüllt ist. Letztendlich müssen Sie für jede Methode, für die Sie sich entscheiden, ein Opfer bringen.