无法更新逻辑表INSERTED和DELETED

use*_*875 5 sql sql-server triggers sql-server-2008

当我使用以下语句时

update INSERTED set ...
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

无法更新逻辑表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
Run Code Online (Sandbox Code Playgroud)

Nik*_*vić 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
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因无法使用set,则应使用游标逐步执行插入的行.

注意:我假设Calcul有一个名为ID的主键; 在处理触发器时你绝对需要一个.

编辑:

SET NOCOUNT ON指示Sql Server不向客户端返回消息,说明操作影响了多少行.它通常用在触发器中,以避免发送与原始查询的rowcount(插入,更新或删除触发触发器)相冲突的信息.最好将它放在每个触发器的开头,因为select也会返回此消息.