关于一个触发器的问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 18:12:17
自己写了这么一个触发器,要求输入 球员姓名,首发上场次数,替补上场次数,进球数,助攻数,最佳次数。
如果表中已有该球员此类信息,则把数据和原来数据进行相加,
否则插入数据

看看不知道我的代码为什么不行
CREATE TRIGGER updateInfo
ON 球员表现
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON
DECLARE @Name nvarchar(50),@Apps int, @Sub int, @Gls int, @Ast int, @MoM int
SELECT @Name=姓名,@Apps=首发, @Sub=替补, @Gls=进球, @Ast=助攻, @MoM=最佳
FROM inserted
IF (@Name IN (SELECT 姓名 FROM 球员表现))
BEGIN
UPDATE 球员表现
SET 首发=首发+@Apps, 替补=替补+@Sub, 进球=进球+@Gls, 助攻=助攻+@Ast, 最佳=最佳+@MoM
WHERE 球员表现.姓名=@Name
END
ELSE
BEGIN
INSERT INTO 球员表现
VALUES(@Name,@Apps,@Sub,@Gls,@Ast,@MoM)
END
END

改为这样写,支持批量插入数据,用instead of 类型,在插入前触发,用for insert和after insert是一样的需要有回滚操作;当批量插入时就有问题了,会全部回滚

CREATE TRIGGER updateInfo ON 球员表现
instead of INSERT
AS
begin
SET NOCOUNT ON;
update a
set 首发=a.首发+i.首发,替补=a.替补+i.替补, 进球=a.进球+i.进球,助攻=a.助攻+i.助攻, 最佳=a.最佳+i.最佳
from 球员表现 a
inner join inserted i on a.姓名=b.姓名

INSERT INTO 球员表现
select 姓名,首发,替补,进球,助攻,最佳
from inserted i
where not exists(select 1 from 球员表现 where 姓名=i.姓名)
end

ON 球员表现 ?
触发器只能在有DELETE,INSERT,UPDATE动作的时候触发,不能根据某个值来触发

你的是MSSQL 触发器
ON 球员表现
AFTER INSERT

MSSQL没有before after的语句
改成for insert