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

Umgang mit max(ID) in einer gleichzeitigen Umgebung

Hier sind zwei Möglichkeiten, das zu tun, was Sie wollen. Die Tatsache, dass Sie möglicherweise mit einer Verletzung der eindeutigen Einschränkung für EmpCode enden Ich überlasse es Ihnen, sich darum zu kümmern :).

1. Verwenden Sie scope_identity() um die zuletzt eingefügte ID zu erhalten und diese zur Berechnung von EmpCode zu verwenden .

Tabellendefinition:

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
)

Fügen Sie eine Zeile zu Employees hinzu. Sollte in einer Transaktion durchgeführt werden, um sicherzustellen, dass Sie nicht mit dem standardmäßigen Zufallswert von left(newid(), 10) zurückgelassen werden in 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. Machen Sie EmpCode eine berechnete Spalte .

Tabellendefinition:

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
)

Eine Zeile zu Employees hinzufügen:

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