本人目前就职于一家B2C网站,今天在工作中碰到了一个问题,就是需要把有着几百万条数据的订单表table1数据复制到另一个提供给商户查看的表table2中,在插入到table2表时需要对新插入的数据进行分析分别录入到table3表和table4表中,同是table2表中数据保留。如果把查询出来的数据ctrl+c到table2中触发器会有效果,不过百十万的数据让我去粘的话,今天就可以歇着了!
当我们想要使用insert into table1 select * from
table2时,触发器只会执行table2中的第一行。这个时候我们就要使用游标控制插入数据的节奏(LOL玩多了。。。).以下是我今天上午研究的结果,以前没接触过游标,可能有些地方注释的并不正确,谅解!
1 ALTER TRIGGER [dbo].[tri_table2]
2 ON [dbo].[table2] --建立在哪张表上
3 instead of INSERT --插入前触发
4 AS
5 BEGIN
6 --定义变量用于传值
7 DECLARE @MchId VARCHAR(10)
8 DECLARE @MchNo VARCHAR(50)
9 DECLARE @ProductCode VARCHAR(50)
10 DECLARE @SuccGetCardTime DATETIME
11 DECLARE @BuyNo VARCHAR(50)
12 DECLARE @BuyCall VARCHAR(50)
13 DECLARE @SectionNo VARCHAR(50)
14 --创建游标
15 DECLARE YB CURSOR FOR
16 SELECT [MchNo],[MchId],[ProductCode],[SuccGetCardTime],[BuyNo],[BuyCall],[SectionNo]FROM INSERTED--游标读取行信息
17 OPEN YB --打开游标
18 FETCH NEXT FROM YB INTO @MchNo,@MchId,@ProductCode,@SuccGetCardTime,@BuyNo,@BuyCall,@SectionNo--把游标读取到的第一行信息赋值到变量中
19 WHILE @@FETCH_STATUS = 0 --[代表是否读取到数据行]0操作成功,-1 FETCH 语句失败或此行不在结果集中,-2 被提取的行不存在
20 BEGIN
21 --判断表中是否存在该订单
22 IF NOT EXISTS(SELECT 1 FROM table3 WHERE MchNo=@MchNo AND MchId=@MchId)
23 BEGIN
24 --数据迁移到table3表
25 INSERT INTO table3
26 VALUES(@MchNo,@MchId,@ProductCode,@SuccGetCardTime,@BuyNo,@BuyCall,@SectionNo)
27
28 IF(@MchId=‘BJFW‘ OR @MchId=‘BJF2‘)
29 BEGIN
30 --数据迁移到table4表
31 INSERT INTO table4
32 VALUES(@MchNo,@MchId,@ProductCode,@SuccGetCardTime,@BuyNo,@BuyCall,@SectionNo)
33 END
34 END
35 --完成Work_TradeInfo表数据录入
36 INSERT INTO table2
37 VALUES(@MchNo,@MchId,@ProductCode,@SuccGetCardTime,@BuyNo,@BuyCall,@SectionNo)
38 --游标跳到下一行继续循环
39 FETCH NEXT FROM YB INTO @MchNo,@MchId,@ProductCode,@SuccGetCardTime,@BuyNo,@BuyCall,@SectionNo
40 END
41 CLOSE YB --关闭游标
42 DEALLOCATE YB --释放游标
43 END
sql insert触发器 批量插入 游标,布布扣,bubuko.com
时间: 2024-10-22 06:46:53