日期:2014-05-17  浏览次数:20449 次

跪求存储过程高手,遇到个难题。。。

请耐心看哦,大牛们看应该不难:
有三个表A和表B,C

表A(订单主表)
A01[订单编号]
-------------
m01
m02
...

表B(订单明细表订单号和产品编号是关键字)
B01[订单编号]  B02[产品编号]  B03[规格]  B04[规格编号]
------------------------------------------------------
m01            p01            15*15
m01            p02            16*16
m01            p03            20*20

表C(规格表,专放产品)
C01[规格编号,自增长]   C03[规格]    C02[产品编号]
-------------------------------------------
G01             15*15        p01
G02             16*16        p02



简要说一下需求:
需要将下面表C中的规格编号填到订单表A的规格B04字段,存储过程规则是传入一个订单编号A01为参数,然后遍历表B的每一个产品的规格和表C比对,如果发现规格一样的,比如15*15,16*16,则将规格编号G01和G02分别填入到表B的B04字段,如果没有则将新规格和产品编号增加到规格表C中,规格编号自动增长,为了方便写存储过程,这里用一个变量X代替自动获得的自动编号,然后B04字段就更新为X即可。比如20*20这个规格。

表B最终效果如下:
B01[订单编号]  B02[产品编号]  B03[规格]  B04[规格编号]
------------------------------------------------------
m01            p01            15*15      G01
m01            p02            16*16      G02
m01            p03            20*20      G03
...

此时表C为:
C01[规格编号,自增长]   C03[规格]    C02[产品编号]
-------------------------------------------
G01                   15*15        p01
G02                   16*16        p02
G03                   20*20        p03

存储过程是这样的一个订单号作为参数的:
storeP(@A01 nvarchar(20))
..
..

不知道大家看明白吗,写得有点流水账,呵呵 在线等,有疑问我随时回复。

------解决方案--------------------
看懂了,但是不知道意义何在。既然能够有规律算出唯一的规格编号,那么这一列其实就是多余的。

重新考虑一下表格设计为上。
------解决方案--------------------
大致如下:
create proc storeP(@A01 nvarchar(20))
as
begin

update 表B
set B04[规格编号] = 表C.C03[规格]
from 表C
where B01 = @A01
and B03 = 表C.C03
end
------解决方案--------------------

--TableA
if OBJECT_ID('TableA','u') is not null
drop table TableA
create table TableA
(
A01 nvarchar(20)
)
go
insert into TableA
select 'm01' union all
sele