我知道使用IDENT_CURRENT
并不总是返回正确的标识值(在多线程应用程序中尤其如此)。我想改用SCOPE_IDENTITY()
。
例如,这是我的Employee
表:
create table Employee
(
ID int identity(1,1),
Name varchar(20),
SystemID int,
constraint Employee_PK primary key (ID asc)
)
我在下面发表声明:
alter table Employee
add constraint Employee_D1 default ident_current('Employee') for SystemID
我需要修改以使用SCOPE_IDENTITY()
代替。
我尝试了以下内容:
alter table Employee
add constraint Employee_D1 default SCOPE_IDENITITY() for SystemID
这没有给出任何错误。但是在插入一行时,我没有看到此列更新了标识值。我做错了什么?
请注意,SystemID
不能只读取,因此计算字段不是一个选项。
我的练习是尝试在并行进程尝试插入行时尝试在IDENTITY
中删除错误的SystemID
值。
答案 0 :(得分:1)
重新阅读你的答案。 SystemID不是标识列。我不认为您可以使用SCOPE_IDENITITY(),因为它没有添加行并在需要保存值的位置检索新的Identity值。
您需要做的是在插入行之后创建一个触发器以更新SystemId值。 CREATE TRIGGER
答案 1 :(得分:0)
以下是我如何解决这个问题(对于可怜的字段名称道歉,我感觉不是很有创意)
CREATE TABLE employees (
id int identity(1,1) NOT NULL
, name varchar(20) NOT NULL
, actual_system_id int NULL
, system_id As Coalesce(actual_system_id, id)
, CONSTRAINT pk_employees PRIMARY KEY (id)
)
;
INSERT INTO employees (name)
VALUES ('John')
, ('Paul')
, ('George')
, ('Ringo')
;
SELECT id
, name
, system_id
FROM employees
;
UPDATE employees
SET actual_system_id = 937
WHERE name = 'George'
;
SELECT id
, name
, system_id
FROM employees
;