同一表中插入后的sql触发器更新列
我正在尝试写一个触发器,以便在插入完成时更新同一表中的一列 我的桌子是空的同一表中插入后的sql触发器更新列,sql,sql-server,triggers,insertion,Sql,Sql Server,Triggers,Insertion,我正在尝试写一个触发器,以便在插入完成时更新同一表中的一列 我的桌子是空的 create table BlueTooth ( ID int Primary Key NOT NULL , version varchar(45) NOT NULL, score float null, speed float ); 我的扳机是 create or replace trigger BlueToothsc ON BlueTooth after insert as begin update Bl
create table BlueTooth (
ID int Primary Key NOT NULL ,
version varchar(45) NOT NULL,
score float null,
speed float
);
我的扳机是
create or replace trigger BlueToothsc
ON BlueTooth
after insert
as
begin
update BlueTooth set score((select speed from inserted)/(select max(speed) from BlueTooth ) * 100)
END
GO
但是我在第一行的“关键字”或“关键字附近的”不正确语法”中遇到错误
和“as”
谁能帮我一下吗
我想通过(插入速度/max(速度))*100更新BlueTooth
表格score
列
当一个更快的蓝牙版本出现时,分数值应该是100,而其他所有的分数值应该是更低的。语法错误是
1) You have to create or alter the trigger seperately
2) missed = while assigning the value to score in update statement
试试这个扳机
create trigger BlueToothsc
ON BlueTooth
after insert
as
begin
update BlueTooth set score = ((select speed from inserted)/
(select max(speed) from BlueTooth ) * 100)
where ID = (SELECT ID FROM INSERTED)
END
GO
与其存储分数,不如在查询时计算分数。因此,在这种情况下,视图应该完成以下工作:
create table BlueTooth (
ID int Primary Key NOT NULL ,
version varchar(45) NOT NULL,
speed float
);
go
create view BlueToothScores
as
select
ID,
version,
speed,
speed * 100 / MAX(speed) OVER () as score
from
BlueTooth
现在,您不必担心触发器或更新例程-结果总是正确的,因为它们是根据真实数据计算的如果
得分
总是正确的,那么最好在视图中计算,而不是存储在表中。即,如果第一次插入的速度为1
,然后单独插入的速度为100
,则两个分数都将为100。这真的是你想要的吗?@Damien_,不相信你是对的,当我运行触发器时,它只会更改插入的行,而你的示例是正确的,这不是我真正想要的。如果有更快版本的蓝牙,我想更新所有分数值。您有什么建议吗?对于任何多行插入都将失败,并将bluetooth
中所有行的score
更新为相同的值。第一个是错误,我相当肯定第二个不是OP所追求的。@Damien_不相信者对,我可能需要一个过程,在我添加更大的值时更新所有行