Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Beibehalten einer benutzerdefinierten Autoinkrement-Spalte

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.