如何通过SCOPE_IDENTITY函数查询SQL Server数据库中最近一次插入操作生成的自增ID?

2026-04-27 18:400阅读0评论SEO资源
  • 内容介绍
  • 相关推荐

本文共计1063个文字,预计阅读时间需要5分钟。

如何通过SCOPE_IDENTITY函数查询SQL Server数据库中最近一次插入操作生成的自增ID?

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分钟。

如何通过SCOPE_IDENTITY函数查询SQL Server数据库中最近一次插入操作生成的自增ID?

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

这种错位在并发场景下更隐蔽,查半天才发现是触发器偷偷“抢”了标识值。

阅读全文