如何在插入触发器SQL Server中检索标识列值

如何在插入触发器SQL Server中检索标识列值,sql,sql-server,Sql,Sql Server,我有两个相同的表,除了一个有标识列,另一个没有。相反,第二个表使用第一个表中标识列的值。我想在第一个表中插入记录时,我会将其作为触发器插入到第二个表中。我似乎无法正确理解语法 从标识列@EDVisitId返回Null ALTER TRIGGER [dbo].[trgInserterrEDVisitOriginal] ON [dbo].[errEDVisit] AFTER INSERT AS --Name: Bob Avallone --Date: 6-15-2017 -- -- The

我有两个相同的表,除了一个有标识列,另一个没有。相反,第二个表使用第一个表中标识列的值。我想在第一个表中插入记录时,我会将其作为触发器插入到第二个表中。我似乎无法正确理解语法

从标识列@EDVisitId返回Null

ALTER TRIGGER [dbo].[trgInserterrEDVisitOriginal] ON [dbo].[errEDVisit]
AFTER INSERT
AS


--Name:  Bob Avallone
--Date:  6-15-2017
--
--  The purpose of this trigger is to insert a record into errEDVisitOriginal
--  whenever a new errEDVisit is inserted.

--XXXXXXXXXX



    declare @EDVisitId  int
    declare @SubmissionControlID INT


Select  @EDVisitId = EDVisitID from inserted
SELECT @SubmissionControlID = SubmissionControlID  from Inserted


  Begin

Insert Into errEDVisitOriginal (EDVisitId, SubmissionControlID)

VALUES (@EDVisitId, @SubmissionControlID )



End

你只需要你的身份


选择@EDVisitId=scope\u identity

您可以使用scope\u identity从第一个表中获取最后插入的id,将其放入变量,然后插入第二个表


尽管有意复制信息的决定是可疑的,但您对代码的考虑太多了。只是:

if exists (select * from inserted)
insert dbo.errEDVisitOriginal (EDVisitId, SubmissionControlID)
select EDVisitId, SubmissionControlID from inserted;

谢谢你的建议。我放弃了扳机的想法。相反,我只是将第一个表中的新记录插入第二个表中。见下文

Insert errEDVisitOriginal(EdVisitId, SubmissionControlID)
    Select EdVisitId,  SubmissionControlID 
    from errEDVisit where SubmissionControlID = @SubmissionControlID

你的扳机有一个重大缺陷!!!它假定插入的数据中只有一行。sql server中的触发器每次操作触发一次。因此,触发器需要基于集合,而不是基于标量。与其在触发器中执行此操作,不如使用插入过程。在该过程中,您可能希望利用OUTPUT子句,以便捕获所有新插入的标识值。这会获得标识,但会使触发器的缺陷性质永久化。@SeanLange您所指的缺陷是什么?您唯一要说的是,您的帖子中的一个问题是,从标识列@EDVisitId返回的是Null。当您使用scope_identity设置ID时,会出现什么问题?因为在触发器中使用这样的标量变量假定只插入了一行。这不是sql server中触发器的工作方式。触发器需要基于设置。如果在触发器中坚持使用标量值,则必须添加循环。啊!!当插入多行时,在触发器中使用这样的变量不是一个好方法。我没有意识到他在触发器中使用了它。我将在执行插入而不是触发器的存储过程上执行此操作。