sql >> Base de Datos >  >> RDS >> Sqlserver

mantener una columna de incremento automático personalizada

El problema es que cuando se insertan varias filas, está utilizando el mismo ID disponible para todas las filas, debe agregar ROW_NUMBER() para asegurarse de que el xid fuera único en la inserció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];

Con respecto a la prevención de duplicados, puede usar sugerencias de tabla para bloquear xtable al obtener el máximo xid .

El inconveniente de usar estos bloqueos es que obtendrá un interbloqueo. Debe tener una restricción/índice único en esta columna, ya que esto evitará duplicados; sin embargo, también generará excepciones cuando se cumpla una condición de carrera. En última instancia, sea cual sea el método que elija, tendrá que hacer algún tipo de sacrificio.