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