假设有个物料表ShouLiaoList 当更新物料表时 同时插入一个物料记录表LOG中
如果物料表ShouLiaoList 某个单据 更新时,此单据的所有物料 将判断物料记录表LOG是否有该料号
如果没有 就插入该物料号和数量,如果有了 就更新该物料号的数量
代码如下
create trigger [dbo].[update_shouliaolist]
on [dbo].[ShouLiaoList]
for update --插入触发
as
--更新后的数据
select @chufaqi=chufaqi,@wuliaohao=wuliaohao,@sl=sl from Inserted;
if @chufaqi='1'--表示更新成功
begin
if not exists(select * from log where wuliaohao=@wuliaohao)--如果没有此物料记录,则插入
insert into Log values(@wuliaohao,@sl)
ELSE
update log set sl=sl+@sl where wuliaohao=@wuliaohao
end
可是如果在shouliaolist表中有两个相同的物料号同时更新 则不是我所说的要求,如图

在LOG表中,我本意是 只有一条 即数量sl是22

为什么出现这样的情况 是不是当更新第一条数据时 插入这个命令没有执行 所以当执行第二条命令时 仍然是insert命令???
如果要实现我de要求 如何修改 谢谢大家
------解决思路----------------------
要注意,如果你的更新操作会影响多行数据,是有问题的。你这个触发器只能支持一行数据受影响的情况,如果有两行以上数据受影响,这个触发器是有问题的
------解决思路----------------------
你这个问题解决了没有,触发器如果有多条记录更新,可以参考下面的方案
CREATE TRIGGER [dbo].[update_shouliaolist]
ON dbo.ShouLiaoList
AFTER INSERT
AS
BEGIN
--更新后的数据
SELECT
wuliaohao,
SUM(sl) AS sl
INTO
#UpdList
FROM
Inserted
GROUP BY
wuliaohao
UPDATE
aa
SET
aa.sl = aa.sl + b.sl
FROM
[log] aa INNER JOIN #UpdList b ON aa.wuliaohao = b.wuliaohao
INSERT dbo.log(
wuliaohao, sl )
SELECT
wuliaohao, sl
FROM
#UpdList a
WHERE
NOT EXISTS( SELECT * FROM log b WHERE a.wuliaohao = b.wuliaohao )
END
GO
------解决思路----------------------
CREATE TRIGGER [dbo].[update_shouliaolist]
ON [dbo].[shouliaolist]
FOR UPDATE --插入触发
AS
-- 先更新再插入,避免插入后再更新一次
UPDATE Log
SET sl = sl + inserted.sl
FROM Log, inserted
WHERE Log.wuliaohao = inserted.wuliaohao
AND inserted.chufaqi = '1'
INSERT INTO Log
SELECT wuliaohao, sl
FROM inserted
WHERE chufaqi = '1'
AND NOT EXISTS(SELECT *
FROM Log
WHERE Log.wuliaohao = inserted.wuliaohao)