首页 > 代码库 > sql insert触发器 批量插入 游标

sql insert触发器 批量插入 游标

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