如果使用多个插入语句,是否有办法使用SCOPE_IDENTITY?

30

我将会通过一个Web应用程序从CSV文件中导入许多数据行到SQL Server数据库。我需要客户端返回自动生成的ID值。

如果我使用循环来实现,性能会非常糟糕(但我可以毫无问题地使用SCOPE_IDENTITY())。

更高效的解决方案是像这样:

INSERT INTO [MyTable]
VALUES ('1'), ('2'), ('3')
SELECT SCOPE_IDENTITY()

有没有办法获取所有生成的 ID,而不仅仅是最后生成的 ID?


6
不,SCOPE_IDENTITY()只会返回最新插入的一个IDENTITY值。但是你可以查看SQL Server的OUTPUT子句... - marc_s
对于你删除的答案,我的建议是:删除第一行,并将第三行改为 sqlBuilder.Append("OUTPUT INSERTED.autoid ");。如果你想要输出到客户端代码,就不需要将输出放在表变量中。 - Mikael Eriksson
1个回答

61

不,SCOPE_IDENTITY() 只会给你最新插入的IDENTITY值。但是你可以查看SQL Server的OUTPUT子句,请参考官方文档

DECLARE @IdentityTable TABLE (SomeKeyValue INT, NewIdentity INT)

INSERT INTO [MyTable]
OUTPUT Inserted.Keyvalue, Inserted.ID INTO @IdentityTable(SomeKeyValue, NewIdentity)
VALUES ('1'), ('2'), ('3')

在运行了你的 INSERT 语句后,表变量将保存“一些键值”(供您用于标识行)和每个插入行的新插入 ID 值。现在可以尽情利用它! :-)


多个用户在同一张表上工作会有风险吗?他们会得到其他用户的错误ID吗? - Thorsten Kraus
@ThorstenKraus:不,每个交易只会得到他们自己的值。 - marc_s
SQL 2014中不存在Inserted.KeyValue? - Danny Rancher
2
@DannyRancher:这取决于你正在插入的表,Inserted伪表是指它 - 在我的示例中,它指的是MyTable。因此,如果该表包含一个名为Keyvalue的列,则会在OUTPUT语句中显示它。这与任何特定的SQL Server版本无关..... - marc_s
1
喜欢这个解决方案。 - Nick Chan Abdullah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接