SQL 触发器 疑问

maocheng82 2015-08-15 04:18:44
假设有个物料表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要求 如何修改 谢谢大家



...全文
157 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Tiger_Zhao 2015-08-21
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)
回复
Haytor 2015-08-21
你这个问题解决了没有,触发器如果有多条记录更新,可以参考下面的方案


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
引用 5 楼 maocheng82 的回复:
[quote=引用 4 楼 cloudinsky的回复:]要注意,如果你的更新操作会影响多行数据,是有问题的。你这个触发器只能支持一行数据受影响的情况,如果有两行以上数据受影响,这个触发器是有问题的
我影响数据是多行。请问如何修改啊。[/quote]
回复
maocheng82 2015-08-15
引用 4 楼 cloudinsky的回复:
要注意,如果你的更新操作会影响多行数据,是有问题的。你这个触发器只能支持一行数据受影响的情况,如果有两行以上数据受影响,这个触发器是有问题的
我影响数据是多行。请问如何修改啊。
回复
天空的云彩 2015-08-15
要注意,如果你的更新操作会影响多行数据,是有问题的。你这个触发器只能支持一行数据受影响的情况,如果有两行以上数据受影响,这个触发器是有问题的
回复
天空的云彩 2015-08-15
没看懂你的要求,触发器貌似也没什么问题
回复
maocheng82 2015-08-15
是分不够多。还是都出去泡花姑娘去了
回复
maocheng82 2015-08-15
等了这么久了 热心人来帮我解答哈了 谢谢
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-08-15 04:18
社区公告
暂无公告