Sql 如何检索通过insert…select插入的行的标识?

Sql 如何检索通过insert…select插入的行的标识?,sql,sql-server,identity,Sql,Sql Server,Identity,我通过类似以下查询插入记录: insert into tbl_xyz select field1 from tbl_abc 现在,我想检索插入记录的新生成的标识值。如何以最小的锁定量和最大的可靠性做到这一点 SELECT @@IDENTITY 我以前就是这样做的。但不确定这是否能满足你文章的后半部分 编辑 也找到了此链接,但不确定是否相同。。。 您可以使用子句获取此信息 您可以将信息输出到临时目标表或视图 下面是一个例子: DECLARE @InsertedIDs TABLE (ID big

我通过类似以下查询插入记录:

insert into tbl_xyz select field1 from tbl_abc
现在,我想检索插入记录的新生成的标识值。如何以最小的锁定量和最大的可靠性做到这一点

SELECT @@IDENTITY
我以前就是这样做的。但不确定这是否能满足你文章的后半部分

编辑 也找到了此链接,但不确定是否相同。。。

您可以使用子句获取此信息

您可以将信息输出到临时目标表或视图

下面是一个例子:

DECLARE @InsertedIDs TABLE (ID bigint)
INSERT into DestTable (col1, col2, col3, col4)
OUTPUT INSERTED.ID INTO @InsertedIDs
SELECT col1, col2, col3, col4 FROM SourceTable

然后,您可以在InsertedID表中查询插入的ID。

@@IDENTITY将返回上次插入的标识值,因此您可能有两个问题

当心插入表_xyz时执行的触发器,因为这可能会更改@IDENTITY的值

tbl_abc是否有多行。如果是,则@@IDENTITY将只返回最后一行的标识值

问题1可以通过使用作用域\标识而不是@标识来解决
问题2更难解决。tbl_abc中的字段1是否在tbl_xyz中定义了唯一记录,如果是这样,您可以使用标识列从表_xyz中重新选择数据。还有其他使用游标的解决方案,但速度会很慢。

据我所知,在同一个脚本中使用纯SQL无法真正做到这一点。但是你可以创建一个插入触发器。现在,我讨厌触发器,但这是一种方法

根据您尝试执行的操作,您可能希望首先将行插入临时表或表变量,然后以这种方式处理结果集。希望您可以链接到一个独特的专栏

您还可以锁定表,获取max key,插入行,然后再次获取max key并进行范围设置

触发:

临时表:

关键范围:


这将仅检索最后插入的记录的标识。我需要把它们全部检索一遍我把这个问题变成了我最喜欢的问题。我也想知道答案:永远不要使用@@identity,它不会总是返回正确的值!什么太好了!这项功能是什么时候添加的?
--Use the Inserted table.  This conaints all of the inserted rows.
SELECT * FROM Inserted
insert field1, unique_col into #temp from tbl_abc

insert into tbl_xyz (field1, unique_col) select field1, unique_col from tbl_abc

--This could be an update, or a cursor, or whatever you want to do
SELECT * FROM tbl_xyz WHERE EXISTS (SELECT top 1 unique_col FROM #temp WHERE unique_col = tbl_xyz.unique_col)
Declare @minkey as int, @maxkey as int

BEGIN TRANS --You have to lock the table for this to work

  --key is the name of your identity column
  SELECT @minkey = MAX(key) FROM tbl_xyz
  insert into tbl_xyz select field1 from tbl_abc
  SELECT @maxkey = MAX(key) FROM tbl_xyz

COMMIT Trans

SELECT * FROM tbl_xyz WHERE key BETWEEN @minkey and @maxkey