当前位置: 代码迷 >> Sql Server >> msSQL存储过程
  详细解决方案

msSQL存储过程

热度:38   发布时间:2016-04-24 10:33:19.0
求一个msSQL存储过程
本帖最后由 fulans2 于 2014-06-07 13:18:44 编辑
现在有表结构如下
  
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;
---------------------*/
  相关解决方案