当我使用以下声明时
update INSERTED set ...
我收到以下错误:
无法更新逻辑表INSERTED和DELETED
这是触发代码:
create trigger TCalcul
on dbo.Calcul
after insert
as
begin
set nocount on;
declare @Num1 int;
declare @Num2 int;
declare @Op varchar(1);
set @Num1 = (select Num1 from inserted)
set @Num2 = (select Num2 from inserted)
set @Op = (select Op from inserted)
if @Op = '+'
update inserted set Resultat = @Num1 + @Num2
else if @Op = '-'
update inserted set Resultat = @Num1 - @Num2 ;
else if @Op = '*'
update inserted set Resultat = @Num1 * @Num2 ;
else if @Op = '/'
update inserted set Resultat = @Num1 / @Num2 ;
end
go
答案 0 :(得分:6)
由于错误说您无法更改插入。 Table Calcul将包含在调用触发器时由insert提交的行;因此,您可以直接操作该数据。由于有可能一次插入多行,因此您不应使用局部变量,而应使用集合:
create trigger TCalcul
on dbo.Calcul
after insert
as
begin
set nocount on
update Calcul
set Resultat = case Calcul.Op
when '+' then Calcul.Num1 + Calcul.Num2
when '-' then Calcul.Num1 - Calcul.Num2
when '*' then Calcul.Num1 * Calcul.Num2
when '/' then Calcul.Num1 / Calcul.Num2
else null end
from Calcul inner join Inserted on Calcul.ID = Inserted.ID
end
go
如果由于某种原因无法使用set,则应使用cursor逐步插入插入的行。
注意:我假设Calcul有一个名为ID的主键;在处理触发器时你绝对需要一个。
编辑:
SET NOCOUNT ON指示Sql Server不向客户端返回消息,说明操作影响了多少行。它通常用在触发器中,以避免发送与原始查询的rowcount(插入,更新或删除触发触发器)相冲突的信息。最好将它放在每个触发器的开头,因为select也会返回此消息。