MSSQL更新数据,某主键存在则更新,不存在则插入

例如:一个有User和Password的表
希望写一个存储过程;通过传参来实现上述的功能:
原来自己的方法觉得有待改进:
1、使用一个存储过程查询表中是否存在User(SELECT);
2、存在则更新改数据(UPDATE);
3、不存在则新增一条数据,即插入一条数据(INSERT);
我用了三部分来实现此功能,我觉得SQL如此博大精深,应该有一条存储过程解决的方法,无奈水平不够;望高手指点;

你sqlserver什么版本?

2008以上的话可以采用meger into 来解决,不需要存储过程

Merge Into è¢«æ›´æ–°çš„表 p
--从数据源查找编码相同的产品
using ä¸»è¡¨ s on p.关联字段=s.关联字段
--如果编码相同,则更新目标表的名称
When Matched Then Update set P.某字段=s.某字段
--如果目标表中不存在,则从数据源插入目标表
When Not Matched Then Insert (字段1,字段2,字段3...) values (字段1,字段2,字段3...);追问

不好意思,可能表达不太好,可能你理解错我的意思了吧,我意思是只有一个表,表头为id,user,password; id为自增主键;然后我想要添加一个用户(user),但是我不知道该用户在这个表中是否存在,如果存在的话就更新这条数据(即把password(密码)更新了);如果user(用户)不存在的话,就插入这么一条数据。万分感谢!MSSQL2008;

追答

我写了点测试数据,你试验一下

创建表

create table [user]
(id int,
username varchar(20),
password varchar(20))
insert into [user] values (1,'aaa','aaa')

目前表里存在id=1的那条数据

这个时候我如果插入一个用户名bbb,密码bbb的,id同样为1的用户

Merge Into [user] p 
using (select 1 id,'bbb' username,'bbb' password) s on p.id=s.id --括号里那些就是你输入的东西,
When Matched Then Update set p.username=s.username,p.password=s.password
When Not Matched Then Insert (id,username,password) values (id,username,password);

然后此时,你

select * from [user]

 

然后现在插入一条id为2,用户名密码都为ccc的用户

Merge Into [user] p 
using (select 2 id,'ccc' username,'ccc' password) s on p.id=s.id
When Matched Then Update set p.username=s.username,p.password=s.password
When Not Matched Then Insert (id,username,password) values (id,username,password);

然后你再看下结果

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-09
由于你没有给出表名,所以暂且暂且叫做userpassrd,你将表明替换成你的修正一下就可以了,代码如:下
create procedure ifuser
@user nchar(10)
@pwd nchar(10)
as begin
if(select * from userpassword where user=@user)//存在则更新
update userpassword set user=@user
else //不存在则插入
insert into userpassword values(@user,@password)
end追问

还是谢谢了,依照上面的回答的方法解决了。