如果使用多个插入语句,有啥方法可以使用 SCOPE_IDENTITY 吗?

Posted

技术标签:

【中文标题】如果使用多个插入语句,有啥方法可以使用 SCOPE_IDENTITY 吗?【英文标题】:Is there any way to use SCOPE_IDENTITY if using a multiple insert statement?如果使用多个插入语句,有什么方法可以使用 SCOPE_IDENTITY 吗? 【发布时间】:2012-11-04 04:09:49 【问题描述】:

我会将许多数据行从 csv 文件导入 SQL Server 数据库(通过 Web 应用程序)。我需要为客户端返回自动生成的 id 值。

如果我循环执行此操作,性能会很差(但我可以毫无问题地使用SCOPE_IDENTITY())。

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

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

有什么方法可以获取所有生成的 ID,而不仅仅是最后生成的 id?

感谢您的帮助!

最好的问候, 托尔斯滕

【问题讨论】:

不,SCOPE_IDENTITY() 只会为您提供 最新的 插入的 IDENTITY 值。但是您可以查看 SQL Server 的 OUTPUT 子句 .... 评论您已删除的答案:我认为您应该删除第一行并将第三行更改为sqlBuilder.Append("OUTPUT INSERTED.autoid ");。如果您希望输出到客户端代码,则无需将输出放入表变量中。 【参考方案1】:

不,SCOPE_IDENTITY() 只会为您提供 最新的 插入的 IDENTITY 值。但是你可以check out the OUTPUT clause of SQL Server ....

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(其他用户的)吗? @ThorstenKraus:不,每笔交易都只取回自己的值 Inserted.KeyValue 在 SQL 2014 中不存在? @DannyRancher:取决于 - Inserted 伪表是指您要插入的表 - 在我的示例中,它是指 MyTable。因此,如果该表包含Keyvalue 列,那么它将在OUTPUT 语句中显示该列。这与任何特定的 SQL Server 版本无关..... 喜欢这个解决方案

以上是关于如果使用多个插入语句,有啥方法可以使用 SCOPE_IDENTITY 吗?的主要内容,如果未能解决你的问题,请参考以下文章

SCOPE_IDENTITY的用法

在 T-Sql 插入语句中使用 Row Constructor 语法有啥好处?

@@IDENTITY与SCOPE_IDENTITY的用法

sql server 2005 一个索引多个字段,字段的排列顺序对搜索有啥影响??

sqlite数据库写入数据慢,有啥办法吗

list,set,map有啥区别