Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Manipulando max(ID) em um ambiente simultâneo


Aqui estão duas maneiras de fazer o que você quer. O fato de que você pode acabar com uma violação de restrição exclusiva em EmpCode Vou deixar você se preocupar :).

1. Use scope_identity() para obter o último ID inserido e usá-lo para calcular EmpCode .

Definição da tabela:
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
)

Adicione uma linha a Funcionários. Deve ser feito em uma transação para ter certeza de que você não ficará com o valor aleatório padrão de left(newid(), 10) em 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. Faça EmpCode uma coluna calculada .

Definição da tabela:
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
)

Adicione uma linha a Funcionários:
insert into Employees (DistrictCode) values ('AB')