标题: SQL 储存过程通过查询时时更新数据到另一张表中 [打印本页] 作者: 天涯沦落20131 时间: 2022-3-30 10:44 标题: SQL 储存过程通过查询时时更新数据到另一张表中 SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE sp_insert_sc_xd_wltgb
@ID int,
@kf varchar(15),
@cpdm varchar(40),
@cplh varchar(40),
@mh varchar(15),
@scxd int,
@gdbh varchar(40),
@gdzq datetime,
@xdfl varchar(6),
@wldm varchar(45),
@wlmc varchar(50),
@wlgg varchar(50),
@lb varchar(10),
@xdyll int,
@rtn int output
AS
declare
@tID int,
@tkf varchar(15),
@tcpdm varchar(40),
@tcplh varchar(40),
@tmh varchar(15),
@tscxd int,
@tgdbh varchar(40),
@tgdzq datetime,
@txdfl varchar(6),
@twldm varchar(45),
@twlmc varchar(50),
@twlgg varchar(50),
@tlb varchar(10),
@txdyll int
SELECT * INTO #TT
FROM
(SELECT a.ID, a.kf, a.cpdm, a.cplh, a.mh,a.scxd,
a.gdbh, a.gdzq, a.xdfl,d.wldm, d.wlmc,
d.wlgg, d.lb, CEILING(ISNULL(a.scxd + 0.00, 1) * ISNULL(d.dwylb, 0)
) AS xdyll
FROM dbo.sc_xd_tgmxb as a INNER JOIN
dbo.BOM_xxb as d ON a.cplh = d.cplh AND a.mh = d.mh WHERE a.ly ='YES')as aa
if exists(SELECT ID, kf,cpdm, cplh, mh,scxd,
gdbh, gdzq, xdfl,wldm, wlmc,
wlgg, lb, xdyll
FROM #TT
where ID=@ID )
BEGIN
SELECT @TID=ID,@tkf=kf,@tcpdm= cpdm,@tcplh= cplh,@tmh=mh,@tscxd=scxd,
@tgdbh=gdbh, @tgdzq=gdzq, @txdfl=xdfl,@twldm=wldm, @twlmc=wlmc,
@twlgg=wlgg, @tlb=lb,@txdyll= xdyll
FROM #TT
where ID=@ID
if ((@TID=@ID) and (@tkf=@kf) and (@tcpdm= @cpdm) and (@tcplh= @cplh) and (@tmh=@mh) and (@tscxd=@scxd)
and (@tgdbh=@gdbh) and (@tgdzq=@gdzq) and (@txdfl=@xdfl) and (@twldm=@wldm) and (@twlmc=@wlmc) and
( @twlgg=@wlgg) and (@tlb=@lb) and (@txdyll= @xdyll))
begin
set @rtn = 0
end
else
begin
update sc_xd_wltgb set ID=@ID,kf=@kf,cpdm= @cpdm,cplh= @cplh,mh=@mh,scxd=@scxd,
gdbh=@gdbh, gdzq=@gdzq, xdfl=@xdfl,wldm=@wldm, wlmc=@wlmc,
wlgg=@wlgg, lb=@lb,xdyll=@xdyll where ID=@ID
set @rtn = 2
end
end
else
begin
insert into sc_xd_wltgb values (@ID, @kf,@cpdm, @cplh, @mh,@scxd, @gdbh, @gdzq, @xdfl,@wldm, @wlmc, @wlgg, @lb, @xdyll)
set @rtn = 1
END
GO
高手们帮助看看,储存过程+临时表,未能更新数据,新手别喷!作者: 天涯沦落20131 时间: 2022-3-30 10:45 本帖最后由 天涯沦落20131 于 2022-3-30 17:57 编辑
说明一下 : 1、有3张表:表1(a.ID, a.kf, a.cpdm, a.cplh, a.mh,a.scxd,a.gdbh, a.gdzq, a.xdfl from dbo.sc_xd_tgmxb as a)---下单
表2(d.wldm, d.wlmc, d.wlgg, d.lb,d.dwyl from dbo.BOM_xxb as d )---BOM
表3(ID, kf,cpdm, cplh, mh,scxd, gdbh, gdzq, xdfl,wldm, wlmc,wlgg, lb, xdyll from sc_xd_wltgb)物料表
2、通过查询表1,表2 更新数据到表3
遇到问题:
1、表2 BOM 是多款物料对一个表1定单,通过查询会产生多条相同的数据
2、查询无主键,插入新表会产生重得数据
3、做到订单下单时时更新到表3
以上敬请高手指点!非常感谢!
2、查询无主键,插入新表会产生重得数据
使用row_number() over(partition by 类别1,类别2 order by 日期1,日期2) As 序号,嵌套后使用where 序号=1。
或者使用distinct去重。具体请参考: ——前者更彻底。比如,一个订单有两个批次,如果distinct包含了批次,无法去重;但如果用row_number按订单号partition,那么就能去重。 SQL Server 几种去重总结3、做到订单下单时时更新到表3
下单时自动更新,只能使用触发器(比如for insert)。具体请参考: SQL触发器的使用及语法 sql插入触发器-插入前检测数据
触发器是写在后台,被前端调用的程序。故而需要在前端的插入数据操作按钮里加上这个操作,这样每次插入订单就会自动更新一次物料表了。
如果不需要频繁操作触发器的话,可以使用存储过程。自动调度存储过程,这里涉及了“作业”的概念,请参考以下链接的第5步: 利用SQL脚本完成数据库同步
感谢你的回复!access+SQL server 做的内部小系统,已能实现自已想要的数据统计功能,感谢这个平台,也感谢你一如既往的支持;小白自搞一波三折,遇到了很多问题!不在网上救助衬步难行!我也想了一些办法,防重得插入增加了一些条件!
insert into by_sc_data.dbo.sc_xd_wltgb( kf, cpdm, cplh, mh,scxd,
gdbh, gdzq, xdfl,wldm, wlmc,
wlgg, lb, xdyll)
select * from by_sc_data.dbo.sc_xd_wlcx a
where not exists(select * from by_sc_data.dbo.sc_xd_wltgb b where b.cplh=a.cplh and b.gdbh=a.gdbh and b.scxd=a.scxd and
b.mh=a.mh and b.wldm=a.wldm and b.xdyll=a.xdyll and b.gdzq<=a.gdzq)