基本上我有一个存储过程,将一行插入表中,我需要获得该行的身份。
我正在从事一个涉及实时数据处理的项目,并且我有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。