现在有表结构如下
id useerNick phoneItem
3 aaa item1,9;item2,6;
表示aaa用户购买了item1共9部,item2共6部。
需求,购买的数据可能增加,同款机型购买数量可能改变,如
**********************************
myProc 'aaa','item1,8' --phoneItem结果 item1,8;item2,6
myProc 'aaa','item3,9' --phoneItem结果 item1,8;item2,6;item3,9
若这个用户不存在则为新购买,直接插入数据
**********************************************
求存储过程myProc 。希望高人指教。
------解决方案--------------------
--修正如下:
Create Table t(id int identity(1,1),
userNick varchar(20),
phoneItem varchar(500)
);
insert into t (userNick,phoneItem) Values('aaa','item1,9;item2,6');
CREATE proc [dbo].[myMroc](@un varchar(20),@it varchar(500))
AS
BEGIN
declare @s varchar(501), @s2 varchar(501), @i int
select @s=phoneItem+';' from t where userNick=@un
if @s is null
begin
insert into t Values(@un, @it)
return
end
set @i=charindex(';'+left(@it,charindex(',',@it)),';'+@s)
if @i>0
begin
SELECT @s2=RIGHT(@s,LEN(@s)-@i+1),@s2=RIGHT(@s2,LEN(@s2)-CHARINDEX(';',@s2))
,@s2=LEFT(@s,@i-1)+@it+';'+@s2
,@s2=LEFT(@s2,LEN(@s2)-1)
update t set phoneItem=@s2 where userNick=@un
end
else
begin
update t set phoneItem=phoneItem+';'+@it where userNick=@un
end
END
------解决方案--------------------
又完善了一下细节:
1. 修正了有用户名称但 phoneItem 为空时执行错误
2. 使变量名称更好记
Create Table t(id int identity(1,1),
userNick varchar(20),
phoneItem varchar(500)
);
insert into t Values('aaa','item1,9;item2,6;');
--select * from t
go
create proc myMroc(@un varchar(20), @pi varchar(14))
as
declare @old_pi varchar(500), @it varchar(10), @i int;
select @old_pi=phoneItem from t where userNick=@un;
if @@ROWCOUNT=0
begin
insert into t Values(@un, @pi+';');
return;
end
set @it=left(@pi, charindex(',', @pi));
set @i=charindex(@it, @old_pi);
if @i>0
begin
update t
set phoneItem=stuff(@old_pi,
@i+LEN(@it),
charindex(';', @old_pi, @i)-@i-LEN(@it),
substring(@pi, LEN(@it)+1, len(@pi))
)
where userNick=@un;
end
else begin
update t set phoneItem=@old_pi + @pi + ';'
where userNick=@un;
end
go
exec myMroc 'aaa','item1,8';
exec myMroc 'aaa','item3,9';
exec myMroc 'ccc','item1,11';
exec myMroc 'aaa','item2,33';
select * from t;
drop table t
drop proc myMroc
/*------结果---------
1 aaa item1,8;item2,33;item3,9;
2 ccc item1,11;
---------------------*/