我将会通过一个Web应用程序从CSV文件中导入许多数据行到SQL Server数据库。我需要客户端返回自动生成的ID值。
如果我使用循环来实现,性能会非常糟糕(但我可以毫无问题地使用SCOPE_IDENTITY()
)。
更高效的解决方案是像这样:
INSERT INTO [MyTable]
VALUES ('1'), ('2'), ('3')
SELECT SCOPE_IDENTITY()
有没有办法获取所有生成的 ID,而不仅仅是最后生成的 ID?
我将会通过一个Web应用程序从CSV文件中导入许多数据行到SQL Server数据库。我需要客户端返回自动生成的ID值。
如果我使用循环来实现,性能会非常糟糕(但我可以毫无问题地使用SCOPE_IDENTITY()
)。
更高效的解决方案是像这样:
INSERT INTO [MyTable]
VALUES ('1'), ('2'), ('3')
SELECT SCOPE_IDENTITY()
有没有办法获取所有生成的 ID,而不仅仅是最后生成的 ID?
不,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
值。现在可以尽情利用它! :-)
Inserted
伪表是指它 - 在我的示例中,它指的是MyTable
。因此,如果该表包含一个名为Keyvalue
的列,则会在OUTPUT
语句中显示它。这与任何特定的SQL Server版本无关..... - marc_s
SCOPE_IDENTITY()
只会返回最新插入的一个IDENTITY
值。但是你可以查看SQL Server的OUTPUT
子句... - marc_ssqlBuilder.Append("OUTPUT INSERTED.autoid ");
。如果你想要输出到客户端代码,就不需要将输出放在表变量中。 - Mikael Eriksson