MS SQL Server 2005存储过程整数列自增更新失败求助
问题排查与解决
首先看你这段代码里最关键的错误:SELECT语句的变量赋值方向写反了!
你原来的代码是:
SELECT ControlNo = @c FROM MedicaidInterchange WHERE 1=1 AND Interkey = @InterKey;
这行代码的作用是查询MedicaidInterchange表时,把变量@c的值作为ControlNo列的别名返回,而不是把表中ControlNo的实际值赋值给变量@c!这就导致@c始终是你声明时的初始值(大概率是0,加1后就是1,所以每次更新后ControlNo都会变成1)。
修正后的基础版本
把SELECT语句的赋值方向改过来,将表中列的值赋给变量:
-- 正确的变量赋值:将表中ControlNo的值存入@c SELECT @c = ControlNo FROM MedicaidInterchange WHERE Interkey = @InterKey; -- 可选:如果没有找到对应行,给@c一个初始值(根据你的业务需求调整) IF @c IS NULL SET @c = 0; SET @c = @c + 1; UPDATE MedicaidInterchange SET InterDate = @d, InterTime = @t, ControlNo = @c WHERE Interkey = @InterKey;
更安全的原子更新方式(推荐)
上面的写法存在并发风险:如果多个会话同时读取同一个InterKey的ControlNo,然后都加1再更新,会导致计数器重复或丢失更新。更好的方式是直接在UPDATE语句中完成加1操作,这是原子性的,SQL Server会自动处理锁的问题:
UPDATE MedicaidInterchange SET InterDate = @d, InterTime = @t, ControlNo = ISNULL(ControlNo, 0) + 1 -- 如果ControlNo是NULL,先设为0再加1 WHERE Interkey = @InterKey;
这种写法不需要额外的SELECT和变量,一步完成读取、加1、更新的操作,完全避免了并发冲突,代码也更简洁。
内容的提问来源于stack exchange,提问作者user9173591
相关产品推荐
相关产品推荐

