Scope_identity()不能正常工作?如何获取存储过程插入的最后一行的标识?

时间:2017-05-03 09:20:19

标签: sql sql-server tsql

基本上我有一个存储过程,在表中插入一行,我需要获取该行的标识。

我正在开发一个涉及实时数据处理的项目,我有两个基本上具有相同结构(模式)的表,唯一的区别是第一个表只包含已完成的"会话" ,而另一个仅包含"活动会话"(尚未完成并且当前正在实时修改的会话)。

我还有另一个表(第三个表),其中包含有关会话的用户编写的注释。该关系是表中的SessionID(标识)列,其中包含已完成的结果。

基本上,实时表中的所有会话都有sessionid 0(因为它们目前正在修改,我不知道它们什么时候结束)。当在" ID"上调用此SP时,会话#34; ID"被删除,并将其移至具有完成结果的表格。当行插入完成的结果表中时,"会话ID"自动添加。

现在我正在使用SCOPE_IDENTITY(),SP看起来像这样:

procedure [dbo].[EndActiveSession](@ID bigint)
as begin

    declare @column1variable bigint
    select @column1variable = column1 from realTimeTable where ID = @ID

    if @column1variable > 0
    begin
          insert into FinishedResultsTable(ID, column1, column2, column3, column4, column5, column6, column7)
          select ID, column1, GETDATE(), column2, column3, column4, column5, column6
          from realTimeTable
          where ID = @ID and column1 > 0

          declare @SessionID bigint

          select @SessionID = SCOPE_IDENTITY()

          update comments_table set SessionID = @SessionID
          where SessionID = 0 and ID = @ID
    end

  delete from realTimeTable where ID = @ID
  --the rest of the logic, that doesn't concern these tables and works perfectly fine
end

问题在于始终无法正常工作。有时评论并未指向正确的会话ID"

我检查了其他主题,在microsoft docs中搜索过,但是找不到任何东西。这是

非常感谢任何输入!

2 个答案:

答案 0 :(得分:0)

看起来像竞争条件。 SCOPE_IDENTITY()正常运行。

在您发布的代码中,当“会话”在两个表中都有状态时(在插入之后,在删除之前),存在重叠。在此期间可以添加评论。有些会更新,有些则不会。此外,因为更新需要添加SessionID = 0谓词,表明ID = @ID条件不足以找到会话注释,进一步指示竞争条件。并且限制所有,看起来没有任何事务可以覆盖工作,因此任何中间错误都会使状态不一致。并且没有错误检查,INSERT .. SELECT ...可能会插入0行,不会产生任何身份。

这看起来真的模型不佳。在创建时生成唯一的会话ID,将其与归档一起传输,将注释链接到永不改变的一个会话ID。

答案 1 :(得分:0)

使用@@ IDENTITY或SCOPE_IDENTITY的另一种选择是这样的 -

create table Fred (
  Id int identity(1, 1)
  , SomeText varchar(120)
  , SomeDate datetime
  , SomeAmt float
);

declare @t table (Id int);

insert into Fred (SomeText, SomeDate, SomeAmt)
output inserted.Id into @t
select 'BILL', GETDATE(), 123.4;

select * from @t;

最后你会发现表变量@t将有一行,其中包含新插入的行ID。