SQL Server中获取UPDATE操作更新的非标识列最新值的方法
获取UPDATE后列的最新值:替代SCOPE_IDENTITY的方案
嘿,刚好碰到过类似的场景!首先得明确:SCOPE_IDENTITY()是专门用来获取当前作用域里插入操作生成的自增ID的,对于更新现有行的列值,它派不上用场。不过有几个更合适的方法可以直接拿到更新后的validateCounts值,我给你梳理下最常用的两种:
1. 用OUTPUT子句(推荐!一步到位)
这是SQL Server里最直接的方式,能在执行UPDATE的同时返回更新后的列值,不用单独再跑SELECT。写法很简单,把OUTPUT inserted.列名加到UPDATE语句里就行:
UPDATE sms.customerOtp SET validateCounts = validateCounts + 1 OUTPUT inserted.validateCounts -- 这里返回更新后的数值 WHERE customerID = '123';
执行这条语句后,结果集里就会直接给出更新后的validateCounts值,一步完成更新+查询,效率还高,也不用担心中间被其他事务修改的问题(因为是原子操作)。
2. 事务内结合锁定(适合必须分两步的场景)
如果因为某些原因你必须先执行UPDATE,再单独SELECT,那一定要把操作放在同一个事务里,并且给行加锁,防止其他事务在中间修改这个值。比如:
BEGIN TRANSACTION; -- 先锁定目标行,避免其他事务修改 SELECT validateCounts FROM sms.customerOtp WITH (UPDLOCK, HOLDLOCK) WHERE customerID = '123'; -- 执行更新 UPDATE sms.customerOtp SET validateCounts = validateCounts + 1 WHERE customerID = '123'; -- 再次查询获取最新值 SELECT validateCounts FROM sms.customerOtp WHERE customerID = '123'; COMMIT TRANSACTION;
不过这种方法多了一步查询,而且要手动管理事务,不如OUTPUT子句简洁高效,所以优先推荐第一种。
内容的提问来源于stack exchange,提问作者Mar1009
相关产品推荐
相关产品推荐

