在约束中使用SCOPE_IDENTITY()

时间:2014-04-07 12:36:22

标签: sql-server database identity identity-column

我知道使用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值。

2 个答案:

答案 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
;