如果使用多个插入语句,有啥方法可以使用 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 T-Sql 插入语句中使用 Row Constructor 语法有啥好处?