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

Manejo de max(ID) en un entorno concurrente

Aquí hay dos formas de hacer lo que quieres. El hecho de que podría terminar con una violación de restricción única en EmpCode Dejaré que te preocupes :).

1. Use scope_identity() para obtener el último ID insertado y usarlo para calcular EmpCode .

Definición de tabla:

create table Employees
(
  ID int identity primary key,
  Created datetime not null default getdate(),
  DistrictCode char(2) not null,
  EmpCode char(10) not null default left(newid(), 10) unique
)

Agregue una fila a Empleados. Debe hacerse en una transacción para asegurarse de que no se quedará con el valor aleatorio predeterminado de left(newid(), 10) en EmpCode :

declare @ID int

insert into Employees (DistrictCode) values ('AB')

set @ID = scope_identity()

update Employees
set EmpCode = cast(year(Created) as char(4))+DistrictCode+right([email protected], 4)
where ID = @ID 

2. Hacer EmpCode una columna calculada .

Definición de tabla:

create table Employees
(
  ID int identity primary key,
  Created datetime not null default getdate(),
  DistrictCode char(2) not null,
  EmpCode as cast(year(Created) as char(4))+DistrictCode+right(10000+ID, 4) unique
)

Agregue una fila a Empleados:

insert into Employees (DistrictCode) values ('AB')