Sql server 在约束中使用SCOPE_IDENTITY()

Sql server 在约束中使用SCOPE_IDENTITY(),sql-server,database,identity,identity-column,Sql Server,Database,Identity,Identity Column,我知道使用IDENT_CURRENT不会总是返回正确的标识值(在多线程应用程序中尤其如此)。我想改用SCOPE\u IDENTITY() 例如,这是我的Employee表: create table Employee ( ID int identity(1,1), Name varchar(20), SystemID int, constraint Employee_PK primary key (ID asc) ) 我有以下声明: alter

我知道使用
IDENT_CURRENT
不会总是返回正确的标识值(在多线程应用程序中尤其如此)。我想改用
SCOPE\u 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\u IDENTITY()

我尝试了以下方法:

alter table Employee 
  add constraint Employee_D1 default SCOPE_IDENITITY() for SystemID
这没有给出任何错误。但在插入一行时,我没有看到该列使用标识值进行更新。我做错了什么

请注意,
SystemID
不能是只读的,因此计算字段不是选项


我在这里的练习是尝试在
SystemID
中消除输入错误的
IDENTITY
值,以防并行进程尝试插入行。

只需重新阅读您的答案。SystemID不是标识列。我认为您不能使用SCOPE_idenity(),因为它没有在需要保存值时添加行并检索新标识值


您需要做的是在插入行之后创建一个触发器来更新SystemId值

下面是我如何处理这个问题的(为糟糕的字段名道歉,我觉得自己没有创造性)


问题在于ident_current是否用于预测下一个值,否则使用它应该是安全的,因为它为任何会话提供了最后一个标识值。SCOPE_IDENTITY仅在当前会话中有效,我认为这就是为什么您无法从中获得价值。但我不确定您从该约束中得到了什么好处?同意Allan的观点-使用默认值为
SCOPE\u IDENTITY
的列有什么意义??如果您的表中需要一个唯一的值-请使用
INT-IDENTITY
类型的列-但是使用具有相同值的第二列有什么好处?如果您必须有类似的内容-您需要在插入时使用
触发器。
我很困惑-
ID
已经是
标识
列-您是否试图确保
SystemID
始终等于
ID
?或者到另一个表中的
ID
?为什么您希望两列在同一个表中保存完全相同的数据?SystemID实际上会基于其他约束具有不同的值,而存储ID则不然。我给出的示例只是一个简化版本,它只关注我所面临的问题,而不是业务规则。如果并行进程正在插入行,插入后的
触发器是否有助于使用正确的标识值更新
SystemID
。只要使用触发器中插入的表来获取新ID。
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
;