本人目前就职于一家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