首页 > 解决方案 > SQL Server SCOPE_IDENTITY() 与 @@IDENTITY

问题描述

SCOPE_IDENTITY()不使用和切换到会有什么好处@@IDENTITY吗?对于我正在谈论的区域是为我们的客户设置数据库的安装脚本的一部分。它在一个表中插入一条记录,并使用该表中的标识符键并将其插入到另一个表中的外键中。我们这样做了两次。

我们似乎有一种罕见的情况,在这种情况下第二次发生这种情况,我们将第一次插入的 id 插入到第二次表中以进行两次传递,从而导致数据出现问题。有可能完全是其他原因导致了这种情况,但我的领先优势似乎已经归咎于SCOPE_IDENTITY()可能是罪魁祸首。

Declare @TheId int

Insert into dbo.TableName (Name) Values ('xxxx')
Select @TheId = SCOPE_IDENTITY()

-- some code here that uses @TheId
-- ...

Insert into dbo.TableName (Name) Values ('yyyy')
Select @TheId = SCOPE_IDENTITY()

-- some code here that uses @TheId
-- at this point, we may have the condition that SCOPE_IDENTITY() still has the value before that 2nd insert...

标签: sql-server

解决方案


在这种情况下,唯一scope_identity()可能具有先前 id 值的方法是INSERT语句不创建任何行。在那种情况下,@@IDENTITY什么都解决不了。事实上,@@IDENTITY不太具体,因此只能希望让事情变得更糟。

您可以做的是为第二次插入使用不同的变量。或者,您可以设置@TheIdNULL第二次插入运行之前。通过这种方式,您将能够判断是否出现问题。@@rowcount对此也很有用。

我确实在评论中看到了这一点:


“第二次插入没有失败,因为在数据库中找到了记录。”


我把它告诉你,在代码运行之前,记录可能已经在数据库中了。此外,如果表上有约束,这可能是插入失败的原因。


推荐阅读