SQL @@IDENTITY与SCOPE_IDENTITY()

存储过程获取自增主键用到@@IDENTITY,但是对表加触发器后,会出现获取的Id与实际插入的Id不一致。通过网上查询,用SCOPE_IDENTITY()就解决了。
两者区别:
@@IDENTITY
返回当前会话所有作用域的最后一个ID
SCOPE_IDENTITY()
返回当前作用域的最后一个ID
修改前:
在这里插入图片描述
修改后:
在这里插入图片描述

### SQL Server 中 `SCOPE_IDENTITY()` 函数的使用说明 `SCOPE_IDENTITY()` 是 SQL Server 提供的一个函数,用于返回当前作用域中最后一次插入操作所生成的标识值(即自增长列的值)。此函数的作用范围仅限于当前会话和当前作用域内的最后一个 `INSERT` 操作[^1]。 #### 特性描述 - 如果在同一个作用域内执行多个 `INSERT` 操作,只有最近一次插入的标识值会被返回。 - 若在作用域内尚未发生任何插入操作便调用了 `SCOPE_IDENTITY()`,则其返回值将是 `NULL`。 - 当其他功能如 `OUTPUT` 子句联合使用时需要注意潜在冲突情况,例如某些场景下可能导致 `SCOPE_IDENTITY()` 返回 `NULL` 的现象被报告过[^2]。 #### 解决方案实践案例 为了演示如何正确利用 `SCOPE_IDENTITY()` 来捕获新插入记录的身份字段值,在下面提供了一个具体的例子: 假设存在一张名为 `Employees` 的表结构定义如下: ```sql CREATE TABLE Employees ( EmployeeID INT IDENTITY(1,1), Name NVARCHAR(50), Position NVARCHAR(50) ); ``` 以下是通过存储过程实现向上述表格添加员工信息的同时获取刚创建条目的唯一编号的方法之一: ```sql -- 创建一个简单的存储过程来展示 SCOPE_IDENTITY 的用法 CREATE PROCEDURE InsertEmployeeAndGetID @Name NVARCHAR(50), @Position NVARCHAR(50), @NewID INT OUTPUT -- 定义输出参数接收新的身份值 AS BEGIN SET NOCOUNT ON; INSERT INTO Employees (Name, Position) VALUES (@Name, @Position); -- 获取刚刚插入行的 ID 并赋给输出变量 SELECT @NewID = SCOPE_IDENTITY(); END; GO DECLARE @InsertedID INT; -- 声明局部变量保存结果 EXEC InsertEmployeeAndGetID 'John Doe', 'Developer', @InsertedID OUT; PRINT 'The new employee''s ID is: ' + CAST(@InsertedID AS VARCHAR); -- 输出新产生的 ID ``` 以上脚本展示了怎样在一个事务性的环境中安全有效地运用 `SCOPE_IDENTITY()` 方法取得最新加入项的关键字属性值。值得注意的是这里采用了显式的交易控制机制以确保数据一致性以及错误处理能力未予体现但实际开发过程中应当考虑进去[^3]。 另外还需注意不同版本间的细微差异可能影响最终行为表现形式,请参照官方文档确认目标环境支持状况后再做决定[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值