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