首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2012-12-20 
跪求存储过程高手,遇到个难题。。。请耐心看哦,大牛们看应该不难:有三个表A和表B,C表A(订单主表)A01[订单编号

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


请耐心看哦,大牛们看应该不难:
有三个表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))
..
..

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

[最优解释]

--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
select 'm02'

--TableB
if OBJECT_ID('TableB','u') is not null
drop table TableB
create table TableB
(
B01 nvarchar(20),
B02 nvarchar(20),
B03 nvarchar(20),
B04 nvarchar(20)
)
go
insert into TableB
select 'm01','p01','15*15',null union all
select 'm01','p02','16*16',null union all
select 'm01','p03','20*20',null

--TableC


if OBJECT_ID('TableC','u') is not null
drop table TableC
create table TableC
(
C01 nvarchar(20),
C03 nvarchar(20),
C02 nvarchar(20)
)
go
insert into TableC
select 'G01','15*15','p01' union all
select 'G02','16*16','p02'

go

--存储过程
--实现了更改B表数据
create proc UpdateTableB
(
@A01 nvarchar(20)
)
as
declare @MaxC01 nvarchar(20)
set @MaxC01=''
update TableB 
set B04=isnull(C.C01,(select 'G'+right('0'+convert(nvarchar(2),Max(convert(int,right(C01,2)+1))),2) from TableC))
from TableB B left join TableC C on B.B03 = C.C03 where B01=@A01
go

exec UpdateTableB 'm01'
select *From TableB

--测试结果
--m01p0115*15G01
--m01p0216*16G02
--m01p0320*20G03


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

重新考虑一下表格设计为上。
[其他解释]
大致如下:
create proc storeP(@A01 nvarchar(20))
as
begin

update 表B
set B04[规格编号] = 表C.C03[规格]
from 表C
where B01 = @A01
and B03 = 表C.C03
end
[其他解释]
引用:
看懂了,但是不知道意义何在。既然能够有规律算出唯一的规格编号,那么这一列其实就是多余的。

重新考虑一下表格设计为上。


呵呵 说得对,但是我这里主要目的是要生成新的规格到表C中。
[其他解释]
如果是直接获取输出结果,那:
create procedure getc
@A01 nvarchar(20)
as
begin
select a.b01,a.b02,a.b03,b.c01
from 表B a inner join 表C b on a.B02=b.C02
where a.B01=@A01
end

如果是用来更新表B,则:
create procedure setb
@A01 nvarchar(20)
as
begin
update a set B04=b.C01
from 表B a inner join 表C b on a.B02=b.C02
where a.B01=@A01
end

热点排行