注册 登录
编程论坛 SQL Server论坛

求助SQL触发器更新两个表数据问题

koko2016 发布于 2016-06-15 17:30, 4035 次点击
请问,我需要在B表有数据插入,A表的GS不为0且TPYE='2'时,写触发器更B表和C表的qty的值等于A表的GS.
注:B表的ID字段有相同的数据,需要加SOURCE_ID字段才能在A表找到唯一的数据,同样在C表也需要加两个以条件才能找到唯一的数据

 表结构如下:
A表               
ID    SOURCE_ID    GS    QYT   
A1    A2            11.5      20   
                  
B表               
ID    SOURCE_ID    ORDER_ID    ORDER_RTK    QTY-1          TPYE      QTY
A1      A2                B1                 B2              20           2          20
               
C表               
ID    ORDER_ID    ORDER_RTK    QTY-1          TPEY       QTY
A1     B1               B2               20           2            20
   
触发器这样写更新不了,还请指导,谢谢!

CREATE TRIGGER [dbo].[ONT_QTY]
ON  [dbo].[B]
FOR INSERT
AS
DECLARE
 @ID  uniqueidentifier,
 @SOURCE_ID  uniqueidentifier,
 @ORDER_ID uniqueidentifier,
 @ORDER_RTK  nvarchar(200)
 BEGIN

SELECT @ID=ID,@SOURCE_ID=SOURCE_ID,@ORDER_ID=ORDER_ID,@ORDER_RTK=ORDER_RTK
FROM inserted

UPDATE B
SET B.QTY=A.GS
FROM inserted,A
WHERE  inserted.ID=A.ID
     AND inserted.SOURCE_ID=A.SOURCE_ID
     AND B.TYPE='2'
     AND A.GS<>'0'

UPDATE C
SET C.QTY=A.GS
FROM inserted,A,C
WHERE  inserted.ID=C.ID
       AND  B.ORDER_ID=C.ORDER_ID
      AND    A.GS<>'0'
      AND C.TPEY='2'
END

18 回复
#2
mywisdom882016-06-15 17:52
条件:
A.ID=B.ID AND A.SOURCE_ID=B.SOURCE_ID AND A.GS<>0 AND B.TYPE='2'
A.ID=C.ID AND A.SOURCE_ID=C.SOURCE_ID AND A.GS<>0 AND C.TYPE='2'

更新:B.QYT=A.GS C.QYT=A.GS
是这样吗?
#3
koko20162016-06-15 19:26
更新B表是条件正确,但C表的条件如下:
更新C表时的条件正常的是:A.ID=C.ID
                         AND B. ORDER_ID=C. ORDER_ID
                         AND B. ORDER_RTK=C.ORDER_RTK
                         AND A.GS<>0
                         AND  C.TYPE='2'
#4
mywisdom882016-06-16 09:52
我需要在B表有数据插入,A表的GS不为0且TPYE='2'时,写触发器更B表和C表的qty的值等于A表的GS.
触发的条件:B表有数据插入
触发器干活:更新B表,更新C表
感觉你逻辑有点问题阿。B表有数据插入,怎么还要更新B表

#5
mywisdom882016-06-16 11:28
表结构如下:
A表               
ID    SOURCE_ID    GS    QYT   
A1    A2           11.5  20   
                  
B表               
ID    SOURCE_ID    ORDER_ID    ORDER_RTK    QTY-1        TPYE      QTY
A1    A2           B1          B2           20           2         20
               
C表               
ID    ORDER_ID    ORDER_RTK    QTY-1        TPEY       QTY
A1    B1          B2           20           2          20
你这有2个错误,字段不要用“-”,红色的,B表那里是 TPYE,C表那里是TPEY

[此贴子已经被作者于2016-6-16 11:29编辑过]

#6
koko20162016-06-16 12:32
感谢版主,正如你在4楼所说的。B表有数据插入时,需要把B表和C表的QTY数量,更新为A表的GS。

B表
在A表里,通过ID和SOURCE_ID,能在B表找到唯一对应的数值。

C表

在A表,只有ID相同,不能找到唯一值。C表与B表,通过ORDER_ID和ORDER_RTK和ID,能在B表找到唯一值。

关于字段“QTY-1”错误,更正为“QTY_1”,感谢你指点。
#7
mywisdom882016-06-16 14:58
--update_t2_t3,对应你的ONT_QTY,t1,t2,t3对应你的A,B,C表,测试是可以更新的,但好像你的数据关系有问题,更新不对的。
CREATE TRIGGER [dbo].[update_t2_t3]
ON  [dbo].[t2]
FOR INSERT
AS
DECLARE
 @ID1 varchar(10),
 @SOURCE_ID1 varchar(10),
 @ORDER_ID1 varchar(10),
 @ORDER_RTK1 varchar(10)
BEGIN
SELECT @ID1=ID,@SOURCE_ID1=SOURCE_ID,@ORDER_ID1=ORDER_ID,@ORDER_RTK1=ORDER_RTK FROM inserted

UPDATE t2
SET t2.QTY=t1.GS
FROM inserted,t1
WHERE inserted.ID=t1.ID
      AND inserted.SOURCE_ID=t1.SOURCE_ID
      AND t2.TPYE='2'
      AND t1.GS<>'0'

UPDATE t3
SET t3.QTY=t1.GS
FROM inserted,t1,t3
WHERE  inserted.ID=t3.ID
       AND inserted.ORDER_ID=t3.ORDER_ID
       AND t3.TPYE='2'
       AND t1.GS<>'0'
END
#8
mywisdom882016-06-16 15:27

--drop table t1
--create table t1(ID varchar(10),SOURCE_ID varchar(10),GS numeric(10,2),QYT numeric(10,2))
--create table t2(ID varchar(10),SOURCE_ID varchar(10),ORDER_ID varchar(10),ORDER_RTK varchar(10),QTY_1 numeric(10,2),TPYE varchar(4),QTY numeric(10,2))
--create table t3(ID varchar(10),ORDER_ID varchar(10),ORDER_RTK varchar(10),QTY_1 numeric(10,2),TPYE varchar(4),QTY numeric(10,2))

--update_t2_t3,对应你的ONT_QTY,t1,t2,t3对应你的A,B,C表,好像没问题了,你用你的数据测试看看

CREATE TRIGGER [dbo].[update_t2_t3]
ON  [dbo].[t2]
FOR INSERT
AS
DECLARE
 @ID1 varchar(10),
 @SOURCE_ID1 varchar(10),
 @ORDER_ID1 varchar(10),
 @ORDER_RTK1 varchar(10)
BEGIN
SELECT @ID1=ID,@SOURCE_ID1=SOURCE_ID,@ORDER_ID1=ORDER_ID,@ORDER_RTK1=ORDER_RTK FROM inserted
--这里变量改为@ID1,@SOURCE_ID1,@ORDER_ID1,@ORDER_RTK1,区分你表的字段名称
UPDATE t2
SET t2.QTY=t1.GS
FROM t1,T2
WHERE T1.ID=T2.ID AND T1.ID=@ID1
  AND T1.SOURCE_ID=T2.SOURCE_ID AND T1.SOURCE_ID=@SOURCE_ID1
  AND T1.GS<>0
  AND T2.TPYE='2'

UPDATE t3
SET t3.QTY=t1.GS
FROM t1,t2,T3
WHERE  T1.ID=T3.ID AND T1.ID=@ID1
   AND T2.ORDER_ID=T3.ORDER_ID AND T3.ORDER_ID=@ORDER_ID1
   AND T2.ORDER_RTK=T3.ORDER_RTK AND T3.ORDER_RTK=@ORDER_RTK1
   AND T1.GS<>0
   AND T3.TPYE='2'
END
#9
koko20162016-06-17 12:59
版主,这样还是没有更新到t3表,结果如下图,我也在查找原因
#10
koko20162016-06-17 13:07
发不了图片。
1、挂上触发器
2、t1赋值。INSERT INTO t1 (id,SOURCE_ID,GS,QYT) VALUES ('a1','f2','20','100')
3、t2和t3一起赋值。INSERT INTO t2 (ID,SOURCE_ID,ORDER_ID,ORDER_RTK,QTY_1,TPYE,qty) VALUES ('a1','f2','s201606','cc22','88','2','99')
INSERT INTO t3 (ID,ORDER_ID,ORDER_RTK,QTY_1,TPYE,qty) VALUES ('a1','s201606','cc22','88','2','99')

4、结果是,t2表的qty=20,但是t3表的qty=99,t3表没有变过来
#11
mywisdom882016-06-17 13:48
UPDATE t3
SET t3.QTY=t1.GS
FROM t1,t2,T3
WHERE  T1.ID=T3.ID AND T1.ID=@ID1
   AND T2.ORDER_ID=T3.ORDER_ID AND T3.ORDER_ID=@ORDER_ID1
   AND T2.ORDER_RTK=T3.ORDER_RTK AND T3.ORDER_RTK=@ORDER_RTK1
   AND T1.GS<>0
   AND T3.TPYE='2'
INSERT INTO t1 (id,SOURCE_ID,GS,QYT) VALUES ('a1','f2','20','100')
INSERT INTO t2 (ID,SOURCE_ID,ORDER_ID,ORDER_RTK,QTY_1,TPYE,qty) VALUES ('a1','f2','s201606','cc22','88','2','99')
INSERT INTO t3 (ID,ORDER_ID,ORDER_RTK,QTY_1,TPYE,qty) VALUES ('a1','s201606','cc22','88','2','99')
更新T2:a1=a1,f2=f2,gs=100,tpye='2',条件符合,
更新T3:a1=a1,s201606=s201606,cc22=cc22,gs=100,tpye='2',条件也符合,
应该2个表都会更新阿。
#12
mywisdom882016-06-17 13:50
你直接运行这个,看看
UPDATE t3
SET t3.QTY=t1.GS
FROM t1,t2,T3
WHERE  T1.ID=T3.ID AND T1.ID='a1'
   AND T2.ORDER_ID=T3.ORDER_ID AND T3.ORDER_ID='s201606'
   AND T2.ORDER_RTK=T3.ORDER_RTK AND T3.ORDER_RTK='cc22'
   AND T1.GS<>0
   AND T3.TPYE='2'
#13
koko20162016-06-23 14:37
直接运行这个是可以更新的。
UPDATE t3
 SET t3.QTY=t1.GS
 FROM t1,t2,T3
 WHERE  T1.ID=T3.ID AND T1.ID='a1'
    AND T2.ORDER_ID=T3.ORDER_ID AND T3.ORDER_ID='s201606'
    AND T2.ORDER_RTK=T3.ORDER_RTK AND T3.ORDER_RTK='cc22'
    AND T1.GS<>0
   AND T3.TPYE='2'

但按我的操作步骤,更新不了。如下:
第一步:INSERT INTO t1 (id,SOURCE_ID,GS,QYT) VALUES ('a1','f2','20','100')
第二步:同时在T2和T3插入数据。
INSERT INTO t2 (ID,SOURCE_ID,ORDER_ID,ORDER_RTK,QTY_1,TPYE,qty) VALUES ('a1','f2','s201606','cc22','88','2','99')
 INSERT INTO t3 (ID,ORDER_ID,ORDER_RTK,QTY_1,TPYE,qty) VALUES ('a1','s201606','cc22','88','2','99')

这样T3表的QTY还是等于99.
#14
mywisdom882016-06-23 16:52
我晚上再理一下!
#15
mywisdom882016-06-24 15:05
--建立表和初始数据
drop table t1
drop table t2
drop table t3
go
create table t1(id varchar(10),source_id varchar(10),gs numeric(10,2),qty numeric(10,2))
create table t2(id varchar(10),source_id varchar(10),order_id varchar(10),order_rtk varchar(10),qty_1 numeric(10,2),tpye varchar(4),qty numeric(10,2))
create table t3(id varchar(10),order_id varchar(10),order_rtk varchar(10),qty_1 numeric(10,2),tpye varchar(4),qty numeric(10,2))
go
INSERT INTO t1 (id,source_id,gs,qty) VALUES ('a1','f1',10,100)
INSERT INTO t1 (id,source_id,gs,qty) VALUES ('a1','f2',20,200)
INSERT INTO t1 (id,source_id,gs,qty) VALUES ('a1','f3',30,300)

INSERT INTO t3(id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','s201606','cc11',88,'2',99)
INSERT INTO t3(id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','s201606','cc22',88,'2',99)
INSERT INTO t3(id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','s201606','cc33',88,'2',99)
select * from t1
select * from t2
select * from t3
--建立触发器,不能和上面的一起执行
CREATE TRIGGER [dbo].[update_t2_t3]
ON  [dbo].[t2]
FOR INSERT
AS
DECLARE
 @id1 varchar(10),
 @source_id1 varchar(10),
 @order_id1 varchar(10),
 @order_rtk1 varchar(10)
BEGIN

select @id1=id,@source_id1=source_id,@order_id1=order_id,@order_rtk1=order_rtk from inserted

UPDATE t2
SET t2.qty=t1.gs
FROM t1,T2
WHERE t1.id=t2.id AND t1.id=@id1
  AND t1.source_id=t2.source_id AND t1.source_id=@source_id1
  AND t1.gs<>0
  AND t2.TPYE='2'

UPDATE t3
SET t3.qty=t1.gs
FROM t1,t2,t3
WHERE t1.id=t2.id AND t2.id=t3.id AND t1.id=@id1
  AND t1.source_id=t2.source_id AND t1.source_id=@source_id1
  AND t2.order_id=t3.order_id AND t2.order_id=@order_id1
  AND t2.order_rtk=t3.order_rtk AND t3.order_rtk=@order_rtk1
  AND t1.gs<>0
  AND t3.tpye='2'

END

[此贴子已经被作者于2016-6-24 15:14编辑过]

#16
mywisdom882016-06-24 15:10
--测试
select * from t1
select * from t2
select * from t3
INSERT INTO t2(id,source_id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','f1','s201606','cc11',88,'2',99)
select * from t2
select * from t3
--插入数据前后对比
只有本站会员才能查看附件,请 登录

select * from t1
select * from t2
select * from t3
INSERT INTO t2(id,source_id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','f3','s201606','cc33',88,'2',99)
select * from t2
select * from t3
只有本站会员才能查看附件,请 登录
#17
mywisdom882016-06-24 15:22
经过3轮在 T2表上插入数据,最后结果都更新了.
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
#18
koko20162016-06-24 19:19
首先感谢版主的热心帮助!!

如16楼回复t3表是没有数据的,但你测试的时候,t3表已经有数据存在,把t3表的现有的qty=99改成了qty=10.我的环境是:同时插入t2表和t3表数据,不是只插入t2表,如下

select * from t1
select * from t2
select * from t3
INSERT INTO t2(id,source_id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','f1','s201606','cc11',88,'2',99)
INSERT INTO t3(id,source_id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','f1','s201606','cc11',88,'2',99)
 select * from t2
 select * from t3


#19
mywisdom882016-06-25 00:41
以下是引用koko2016在2016-6-24 19:19:00的发言:

首先感谢版主的热心帮助!!

如16楼回复t3表是没有数据的,但你测试的时候,t3表已经有数据存在,把t3表的现有的qty=99改成了qty=10.我的环境是:同时插入t2表和t3表数据,不是只插入t2表,如下

select * from t1
select * from t2
select * from t3
INSERT INTO t2(id,source_id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','f1','s201606','cc11',88,'2',99)
INSERT INTO t3(id,source_id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','f1','s201606','cc11',88,'2',99)
 select * from t2
 select * from t3
你T3没更新是由于你触发器,只关联T2
你把你插入语句顺序倒过来就可以了。
--先插入T3,这样在插入T2时,就触发,就会更新T3
INSERT INTO t3(id,source_id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','f1','s201606','cc11',88,'2',99)
INSERT INTO t2(id,source_id,order_id,order_rtk,qty_1,tpye,qty) VALUES ('a1','f1','s201606','cc11',88,'2',99)

1