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要求 如何修改 谢谢大家



...全文
188 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
等了这么久了 热心人来帮我解答哈了 谢谢

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧