日期:2014-05-17  浏览次数:20598 次

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
   &nb