哪一个是获取我刚刚通过插入生成的身份值的最佳选择?这些陈述在绩效方面有何影响?
> SCOPE_IDENTITY()
>聚合函数MAX()
> SELECT TOP 1 IdentityColumn FROM TableName ORDER BY IdentityColumn DESC
解决方法
如果要插入单行并想要检索生成的ID,请使用SCOPE_IDENTITY().
CREATE TABLE #a(identity_column INT IDENTITY(1,1),x CHAR(1)); INSERT #a(x) VALUES('a'); SELECT SCOPE_IDENTITY();
结果:
---- 1
如果要插入多行并需要检索生成的ID集,请使用OUTPUT子句.
INSERT #a(x) OUTPUT inserted.identity_column VALUES('b'),('c');
结果:
---- 2 3
and why this is best faster option?
除了性能之外,这些是唯一在默认隔离级别和/或多个用户中保证正确的.即使您忽略了正确性方面,sql Server也会将SCOPE_IDENTITY()中的插入值保存在内存中,因此这自然会比针对表或针对系统表运行您自己的独立查询更快.
忽略正确性方面就像告诉邮递员他在今天的邮件中做得很好 – 他比平均时间快10分钟完成他的路线,问题是,没有邮件被送到正确的房子.
请勿使用以下任何一项:
> @@ IDENTITY – 因为这不能在所有场景中使用,例如当具有标识列的表具有也插入具有其自己的标识列的另一个表的触发器时 – 您将得到错误的值.
> IDENT_CURRENT() – 我详细介绍了这个here,这些注释也很有用,但实际上,在并发下,你经常得到错误的答案.
> MAX()或TOP 1 – 您必须使用可序列化隔离来保护这两个语句,以确保您获得的MAX()不是其他人的.这比仅使用SCOPE_IDENTITY()要昂贵得多.