设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1284|回复: 4
打印 上一主题 下一主题

SQL 储存过程通过查询时时更新数据到另一张表中

[复制链接]
跳转到指定楼层
1#
发表于 2022-3-30 10:44:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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
高手们帮助看看,储存过程+临时表,未能更新数据,新手别喷!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
推荐
 楼主| 发表于 2022-3-30 10:45:52 | 只看该作者
本帖最后由 天涯沦落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
以上敬请高手指点!非常感谢!                        


回复 支持 0 反对 1

使用道具 举报

3#
发表于 2022-4-3 12:13:24 | 只看该作者
答复如下(见红褐色字体):
1、表2 BOM 是多款物料对一个表1定单,通过查询会产生多条相同的数据
BOM表如果是树形结构,请使用递归查询,写法参考以下链接:
【SQL Server】递归查询
是否需要根据最底层进行计算,看你的实际情况。

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脚本完成数据库同步

以上问题算是回答完了。难得逮到一个SQL Server的帖子,自然得罗嗦几句了(如果不想看可以跳过,但我赌你不会)。
---------------------------------------------------------我是分割线--------------------------



1、存储过程不是这样写的啊。应该创建一个叫做“表值函数”的东西用来调用。具体请参考:
巧用表值函数更新数据
2、根据你的脚本。应该是有个upsert(update or insert)的逻辑。SQL Server上可以通过merge来处理,具体请参考:
SQL Server中Upsert的三种方式

3、是否一定要使用upsert来操作呢?个人觉得,可以考虑增加主键字段或者日期等作为判断依据的。
比如,BOM里今天新增了一个物料,那么,是不是可以添加一个日期字段呢?这样的话,前面的“#TT”(姑且这么说吧,个人觉得,应该新建表来存储)同样也把这个日期字段添加进去。两个日期对比,把最新的数据追加进去。
这样做的好处在于每次只是增量,数据量较少,运行快。前提是不能改物料表的数据。比如,今天这个物料ID叫“张三”,明天这个ID就改成“李四”,但日期没改,这就不好判断。
事实上,物料表这样的基础数据,是不应该改底层的,可以添加一个“是否在用”字段来处理那些价格发生变化的同名物料。在前端使用时只选择“是”的数据。
当然,BOM我是不熟的,算是纸上谈兵吧。这点建议,你可以参考也可以不管。
4#
发表于 2022-4-8 09:16:06 | 只看该作者
学习了。谢谢roych!
5#
 楼主| 发表于 2022-4-15 12:16:25 | 只看该作者
roych 发表于 2022-4-3 12:13
答复如下(见红褐色字体):
1、表2 BOM 是多款物料对一个表1定单,通过查询会产生多条相同的数据
BOM表 ...

感谢你的回复!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)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-1 17:51 , Processed in 0.132816 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表