sql-server - 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...
解决方案
在这种情况下,唯一scope_identity()
可能具有先前 id 值的方法是INSERT
语句不创建任何行。在那种情况下,@@IDENTITY
什么都解决不了。事实上,@@IDENTITY
不太具体,因此只能希望让事情变得更糟。
您可以做的是为第二次插入使用不同的变量。或者,您可以设置@TheId
回NULL
第二次插入运行之前。通过这种方式,您将能够判断是否出现问题。@@rowcount
对此也很有用。
我确实在评论中看到了这一点:
“第二次插入没有失败,因为在数据库中找到了记录。”
我把它告诉你,在代码运行之前,记录可能已经在数据库中了。此外,如果表上有约束,这可能是插入失败的原因。
推荐阅读
- java - 在java中可视化图形
- python-3.x - 在 Python 中跨多行和多列生成条件时间增量
- django - Django Web 应用程序中图像下载的服务器端实现(从远程位置提供的图像)
- javascript - Express,如何始终提供静态目录?
- c# - 如何在 API 中自动调用函数?
- javascript - 如果从索引访问,IndexedDB 无法正确获取 Blob(WebKitBlobResource 1. 错误)
- r - R如何将数据与内部点匹配并设置边界
- python-3.x - Python [Errno 32] 断管
- php - PHP - 将图像 URL 转换为 SQL BLOB
- plotly - 在python中的等值线地图上添加位置点