You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:30