我在表上有一个INSTEAD OF INSERT触发器,我发现使用IDENT_CURRENT时出现问题。以下是我的触发器的示例代码。
CREATE TRIGGER [dbo].[Some_Insert_Trigger] ON [dbo].[Table_A]
INSTEAD OF INSERT
AS
BEGIN
//some code with temp table
IF X==Y -- some logic
BEGIN
INSERT INTO Table_B VALUES(....) -- Table B has a identity column
SELECT @justinserted=IDENT_CURRENT('Table_B') - now this @justinserted variable has the last inserted value
END
ELSE
BEGIN
--get the max of ID from Table B
END
// here insert happens into another table which relies on temp table and @justinserted
END
这有时很有效,但不是所有时间。根据文档,IDENT_CURRENT不受范围和会话的限制,因此当两个进程同时命中代码时,IDENT_CURRENT很可能返回由不同进程生成的标识值。 这是一篇很好的文章,它全面解释了我所面临的问题。 http://sqlperformance.com/2014/01/t-sql-queries/ident-current
我不能在这里使用OUTPUT,因为inserted包含TableA而不是TableB