2012-03-16 27 views
5

Cuando uso la siguiente declaraciónLas tablas lógicas insertadas y eliminadas no se pueden actualizar

update INSERTED set ... 

me sale el siguiente error:

The logical tables INSERTED and DELETED cannot be updated

Este es el código de activación:

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 

Respuesta

6

Como dice el error, no puede cambiar insertado. La tabla Calcul ya contendrá las filas enviadas por inserción en el momento en que se invoca el desencadenador; por lo tanto, opera directamente sobre esos datos. Ya que hay una posibilidad de insertar varias filas a la vez, no se debe trabajar con las variables locales, pero trabaja en un conjunto:

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 

Si no puede utilizar Ajuste por alguna razón, entonces debería usar cursor al paso a través de las filas insertadas .

Nota: asumo que Calcul tiene una clave principal llamada ID; Definitivamente necesitarás uno cuando se trata de desencadenantes.

EDIT:

SET NOCOUNT ON indica a SQL Server no devolver un mensaje al cliente diciendo cuántas filas se vieron afectados por una operación. A menudo se usa en desencadenantes para evitar el envío de información que entraría en conflicto con el recuento de filas de la consulta original (insertar, actualizar o eliminar que activó el activador). Lo mejor es ponerlo al comienzo de cada activador, ya que select también devolverá este mensaje.

+0

trabajado y ahorró mi tiempo –

Cuestiones relacionadas