惑乱王妃太腹黑:ms sql2000 的存储过程

来源:百度文库 编辑:高考问答 时间:2024/05/07 16:46:22
我建立了一个存储过程,(是用来在表中保存数据,如果表中存在该数据,就UPDATE,如果没有该数据,就INSERT,主键为货物ID,)如下
CREATE procedure proc_updins
@rwid char(20),@rwmc char(100),@rwzl float,@ksrq char(20),@rwyjts int,@zq int,@sjjsrq char(20),@fz float,@lei char(20) as
declare updins cursor static for select * from MIS where 货物ID=@rwid
open updins
if @@cursor_rows>0
update MIS set 货物ID=@rwid,货物名称=@rwmc,货物总量=@rwzl,进货日期=@ksrq,进货天数=@rwyjts,货物周期=@zq,出货日期=@sjjsrq,价值=@fz,品种=@lei
else
insert into MIS(货物ID,货物名称,货物总量,进货日期,进货天数,货物周期,出货日期,价值,品种) values(@rwid,@rwmc,@rwzl,@ksrq,@rwyjts,@zq,@sjjsrq,@fz,@lei)
close updins
deallocate updins
GO
可是在具体过程中,除非是在表中第一次插入数据,可以UPDATE,再新插入的数据,就不能UPDATE,也就是在运行UPDINS就不成功,请高手指点.
提示:不能重复插入相同的主键

你的update语句没有设置更新条件,根据你的存储过程来看,应该加上WHERE条件来限制要更新的数据,否则整个表的数据将全部被更新。
update MIS set 货物名称=@rwmc,货物总量=@rwzl,进货日期=@ksrq,进货天数=@rwyjts,货物周期=@zq,出货日期=@sjjsrq,价值=@fz,品种=@lei
where 货物ID=@rwid

你补充的信息正说明了问题,你的原句中“update MIS set 货物ID=@rwid”,而货物ID是主键,你没限定要更新哪条数据,结果你的语句就是把主键列更新为同一个值,肯定会失败的。

另外你判断表中是否存在数据为什么要使用游标呢?