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



基本上我有一个存储过程,将一行插入表中,我需要获得该行的身份。

我正在从事一个涉及实时数据处理的项目,并且我有2个具有相同结构(架构(的表,唯一的区别是第一表仅包含完成的"会话",而另一个则包含一个表格仅包含"主动会议"(尚未完成且目前正在实时修改的会话(。

我还有另一个表(第三个表(,其中包含有关会话的用户写的评论。该关系是表格中带有成品结果的SessionID(身份(列。

基本上,实时表中的所有会话都有SessionID 0(因为当前正在修改它们,我不知道它们何时结束(。当该SP在" ID"上调用时,该" ID"的会话将被删除,并以完成的结果移至表。将行插入完成的结果表中时,会自动添加" sessionID"。

现在我正在使用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文档中搜索了,但是找不到任何东西。这是

任何输入都将不胜感激!

使用@@ 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的一行。

看起来像是种族条件。SCOPE_IDENTITY()正常工作。

在您发布的代码中,当两个表中的"会话"都具有状态时(插入后,删除之前,在删除之前(存在重叠。可以在此期间添加评论。有些会更新,有些不会。另外,由于更新需要添加SessionID = 0谓词表明ID = @ID条件不足以找到会话评论,因此进一步指示了赛事条件。总而言之,似乎没有交易来涵盖工作,因此任何中间错误都会使状态不一致。并且没有错误检查,INSERT .. SELECT ...可能会插入0行,没有生成身份。

这看起来确实建模不佳。在创建时生成唯一的会话ID,请与档案进行转移,将注释链接到永远不会更改的一个会话ID。

相关内容

  • 没有找到相关文章

最新更新