Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Gestion de max(ID) dans un environnement concurrent

Voici deux façons de faire ce que vous voulez. Le fait que vous pourriez vous retrouver avec une violation de contrainte unique sur EmpCode Je vous laisse vous inquiéter :).

1. Utilisez scope_identity() pour obtenir le dernier ID inséré et l'utiliser pour calculer EmpCode .

Définition du tableau :

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
)

Ajoutez une ligne à Employés. Doit être fait dans une transaction pour être sûr que vous ne vous retrouverez pas avec la valeur aléatoire par défaut de left(newid(), 10) dans 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. Faire EmpCode une colonne calculée .

Définition du tableau :

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
)

Ajoutez une ligne à Employés :

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