如何通过SCOPE_IDENTITY函数查询SQL Server数据库中最近一次插入操作生成的自增ID?
- 内容介绍
- 相关推荐
本文共计1063个文字,预计阅读时间需要5分钟。
plaintextSCOPE_IDENTITY() 是 SQL Server 中最安全的获取刚插入记录自增 ID 的方法,只要你的 INSERT 和获取操作在同一个作用域(例如同一批次处理、同一存储过程)内,几乎不会出错。
使用 @@IDENTITY 或 IDENT_CURRENT() 是生产环境中 ID 错乱常见的原因。
为什么不能直接用 SELECT @@IDENTITY
因为 @@IDENTITY 不认“作用域”,只认“当前会话中最后生成的标识值”。一旦表上有 INSERT 触发器,且触发器又往另一张带 IDENTITY 列的表里插了数据,@@IDENTITY 就会返回触发器插入的 ID,而不是你本意要的那条。
常见错误现象:
- 你在
Orders表插入订单,期望拿到OrderID - 但
Orders上有个触发器,自动往AuditLog表写日志(AuditLog.ID也是IDENTITY) - 结果
SELECT @@IDENTITY返回的是AuditLog.ID,不是OrderID
这种错位在并发场景下更隐蔽,查半天才发现是触发器偷偷“抢”了标识值。
本文共计1063个文字,预计阅读时间需要5分钟。
plaintextSCOPE_IDENTITY() 是 SQL Server 中最安全的获取刚插入记录自增 ID 的方法,只要你的 INSERT 和获取操作在同一个作用域(例如同一批次处理、同一存储过程)内,几乎不会出错。
使用 @@IDENTITY 或 IDENT_CURRENT() 是生产环境中 ID 错乱常见的原因。
为什么不能直接用 SELECT @@IDENTITY
因为 @@IDENTITY 不认“作用域”,只认“当前会话中最后生成的标识值”。一旦表上有 INSERT 触发器,且触发器又往另一张带 IDENTITY 列的表里插了数据,@@IDENTITY 就会返回触发器插入的 ID,而不是你本意要的那条。
常见错误现象:
- 你在
Orders表插入订单,期望拿到OrderID - 但
Orders上有个触发器,自动往AuditLog表写日志(AuditLog.ID也是IDENTITY) - 结果
SELECT @@IDENTITY返回的是AuditLog.ID,不是OrderID
这种错位在并发场景下更隐蔽,查半天才发现是触发器偷偷“抢”了标识值。

