如何在插入查询中安全地使用当前标识作为值

时间:2017-03-31 21:44:13

标签: sql-server concurrency

我有一个表,其中一列是图像的路径,我需要为要插入的记录创建一个目录。

示例:

insert into Dummy values(CONCAT('a', (select SCOPE_IDENTITY() + 1)))

这样我可以确定文件夹名称始终有效且它是唯一的(两个记录之间没有冲突)。

问题是:我如何安全引用要插入的记录的当前ID?请记住,这是一个高度并发的环境,如果可能的话,我想避免多次访问数据库。

我尝试了以下内容:

config.baseUrl = http://some.internal.ip/site1/

config.absRefPrefix = /

第一个查询不安全,因为当运行1000个并发插入时,我得到了58个重复密钥'异常。

第二个查询无效,因为SCOPE_IDENTITY()为我怀疑的所有查询返回了相同的值。

我的替代方案是什么?

1 个答案:

答案 0 :(得分:0)

使用OUTPUT子句

尝试使用临时表来跟踪插入的ID
INSERT #temp_ids(someval) OUTPUT inserted.identity_column

这将从您的查询中获取所有插入的ID。 '插入'是安全的。