当我在SQL Server中插入新行时,我如何将主键值设置为表中的其他col

本文关键字:设置 键值 其他 col Server SQL 插入 新行时 | 更新日期: 2023-09-27 17:49:33

我使用LINQ-to-SQL类。我正在使用LINQ方法object.InsertOnSubmit()插入一个新行。

我需要设置由SQL Server(使用Identity)为表主键列生成的相同值。

现在我需要在向表中插入新行时相同的值。并且仅在插入时为同一表中的其他列设置相同的值。

插入表后不能更新,因为表有update TRIGGER.

我试了下面的

_db.EmpNews.InsertOnSubmit(_EmpNews);
...
_db.DisplaySeq = _EmpNews.ID;
...
_db.SubmitChanges();

其中ID为自生成(Identity)列

当我在SQL Server中插入新行时,我如何将主键值设置为表中的其他col

第一个问题是:为什么需要在同一个表的两个单独的列中存储相同的值?你要这个做什么?对我来说似乎没有多大意义....

由于IDENTITY列的值只有在实际插入后才可用,因此没有办法在该行确实保存到数据库表之前获取该值并将其设置为另一列。

这基本上留下了三个选项来获取该值并将其存储在其他地方:

  • 你可以编写一个AFTER INSERT触发器,将其他列的值设置为刚刚插入到IDENTITY

  • 中的值
  • 你可以把整个保存过程包装成一个存储过程,你可以从你的c#代码调用(而不仅仅是保存对象),你会做行的INSERT,然后得到新创建的IDENTITY值,并用这个新值再次更新行。但这会导致UPDATE发生-由于UPDATE触发,您似乎说这对您来说是不可能的(不太清楚为什么这应该是一个问题....)

  • 你可以写两行c#代码来获得IDENTITY值后,它被插入(并可在你的对象的ID属性),然后存储对象第二次。但是,同样,会导致UPDATE发生-由于UPDATE触发器,您似乎说这对您来说是不可能的(不太清楚为什么这应该是一个问题....)

所以我猜你最好的选择是一个INSERT触发器来做到这一点。

试试这样写:

CREATE TRIGGER trInsertEmpNews 
ON dbo.EmpNews AFTER INSERT 
AS BEGIN
    UPDATE dbo.EmpNews 
    SET DisplaySeq = i.ID
    FROM INSERTED i
    WHERE dbo.EmpNews.ID = i.ID
END