首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

bug 求解,安插一条记录,执行两次触发器

2013-11-12 
bug 求解,插入一条记录,执行两次触发器本帖最后由 chenh_w 于 2013-10-23 17:34:55 编辑小弟一个小项目用

bug 求解,插入一条记录,执行两次触发器
本帖最后由 chenh_w 于 2013-10-23 17:34:55 编辑 小弟一个小项目用到sqlbulkcopy,所以在触发器里用到了游标(不是很熟),但是插入一条记录时,执行完第一条,游标仍然能读取到记录,再执行一次(if else 之后的fetch成功),小弟水平有限,实在解决不了,求指导,以下是代码

CREATE TRIGGER [dbo].[调拨库存] ON [dbo].[调拨项目] 
FOR  INSERT 
AS
declare @调拨数量 int,@批号 CHAR(11),@调入仓库 CHAR(10),@调出仓库 CHAR(10),@货品编号 CHAR(7)

declare cur_a cursor for
select  调拨数量, 批号,(SELECT 调入仓库 FROM 调拨单 WHERE 调拨单.调拨单号=inserted.调拨单号),
(SELECT 调出仓库 FROM 调拨单 WHERE 调拨单.调拨单号=inserted.调拨单号) ,
(SELECT TOP 1 货品编号 from 库存 where 库存.批号=inserted.批号) from inserted,调拨单

open cur_a

fetch next from cur_a into @调拨数量,@批号,@调入仓库,@调出仓库,@货品编号

while @@fetch_status=0
BEGIN
IF NOT EXISTS(SELECT * FROM 库存 where 库存.批号=@批号 AND 库存.仓库=@调入仓库)
BEGIN
INSERT INTO 库存 (货品编号,当前库存,批号,仓库) values(@货品编号,@调拨数量,@批号,@调入仓库)
UPDATE 库存 SET 当前库存=当前库存-@调拨数量 where 仓库=@调出仓库 and 库存.批号=@批号
END

  ELSE
  BEGIN
   UPDATE 库存 SET 当前库存=当前库存+@调拨数量 where 仓库=@调入仓库 and 库存.批号=@批号
UPDATE 库存 SET 当前库存=当前库存-@调拨数量 where 仓库=@调出仓库 and 库存.批号=@批号
  END

fetch next from cur_a into @调拨数量,@批号,@调入仓库,@调出仓库,@货品编号
end
close cur_a
deallocate cur_a

[解决办法]
引用:
Quote: 引用:

由于你是采用sqlbulkcopy,也就是批量插入,所以一次会插入一批数据,那么比如一批插入2条数据,那么就会触发,insert触发器,在触发器里肯定能读出2条记录哈,

而不是分两次触发的
不是那个意思,我现在没用sqlbulkcopy,而是直接插入一条记录


这样改一下呢,增加了一个2表关联条件:


CREATE TRIGGER [dbo].[调拨库存] ON [dbo].[调拨项目] 
FOR  INSERT 
AS
declare @调拨数量 int,@批号 CHAR(11),@调入仓库 CHAR(10),@调出仓库 CHAR(10),@货品编号 CHAR(7)

declare cur_a cursor for
select  调拨数量, 批号,(SELECT 调入仓库 FROM 调拨单 WHERE 调拨单.调拨单号=inserted.调拨单号),
(SELECT 调出仓库 FROM 调拨单 WHERE 调拨单.调拨单号=inserted.调拨单号) ,
(SELECT TOP 1 货品编号 from 库存 where 库存.批号=inserted.批号) 
 from inserted,调拨单
 where inserted.调拨单号 = 调拨单.调拨单号  --增加这个关联条件
open cur_a

fetch next from cur_a into @调拨数量,@批号,@调入仓库,@调出仓库,@货品编号

while @@fetch_status=0
BEGIN
IF NOT EXISTS(SELECT * FROM 库存 where 库存.批号=@批号 AND 库存.仓库=@调入仓库)
BEGIN
INSERT INTO 库存 (货品编号,当前库存,批号,仓库) values(@货品编号,@调拨数量,@批号,@调入仓库)
UPDATE 库存 SET 当前库存=当前库存-@调拨数量 where 仓库=@调出仓库 and 库存.批号=@批号
END

  ELSE
  BEGIN
   UPDATE 库存 SET 当前库存=当前库存+@调拨数量 where 仓库=@调入仓库 and 库存.批号=@批号
UPDATE 库存 SET 当前库存=当前库存-@调拨数量 where 仓库=@调出仓库 and 库存.批号=@批号
  END

fetch next from cur_a into @调拨数量,@批号,@调入仓库,@调出仓库,@货品编号
end
close cur_a
deallocate cur_a

[解决办法]
try this,

CREATE TRIGGER [dbo].[调拨库存] ON [dbo].[调拨项目] 
FOR INSERT 
AS
declare @调拨数量 int,@批号 CHAR(11),@调入仓库 CHAR(10),@调出仓库 CHAR(10),@货品编号 CHAR(7)
 
declare cur_a scroll cursor for
select 调拨数量,批号,b.调入仓库,b.调出仓库,
       (SELECT TOP 1 货品编号 from 库存 where 库存.批号=a.批号) 
from inserted a
left join 调拨单 b on a.调拨单号=b.调拨单号

open cur_a
fetch first from cur_a into @调拨数量,@批号,@调入仓库,@调出仓库,@货品编号
 
while(@@fetch_status<>-1)
BEGIN
    IF NOT EXISTS(SELECT * FROM 库存 where 库存.批号=@批号 AND 库存.仓库=@调入仓库)
    BEGIN
        INSERT INTO 库存 (货品编号,当前库存,批号,仓库) values(@货品编号,@调拨数量,@批号,@调入仓库)
        UPDATE 库存 SET 当前库存=当前库存-@调拨数量 where 仓库=@调出仓库 and 库存.批号=@批号
    END
    ELSE
    BEGIN
        UPDATE 库存 SET 当前库存=当前库存+@调拨数量-@调拨数量 where 仓库=@调入仓库 and 库存.批号=@批号
    END
    fetch next from cur_a into @调拨数量,@批号,@调入仓库,@调出仓库,@货品编号
end

close cur_a
deallocate cur_a


热点排行