2012-03-16 8 views
5

更新することはできません。論理テーブルが挿入され、DELETEDが、私は次の文</p> <pre><code>update INSERTED set ... </code></pre> <p>を使用すると、私は次のエラーを取得する

The logical tables INSERTED and DELETED cannot be updated

これは、トリガコードです:

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 

答えて

6

エラーとして、挿入された内容を変更することはできません。テーブル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 

あなたには、いくつかの理由のために設定され使用できない場合、あなたは挿入された行をステップ実行するためにcursorを使用する必要があります。

注:CalculにIDという名前の主キーがあると仮定しています。あなたは間違いなくトリガーを扱うときに必要となります。

EDIT:

SET NOCOUNT ONは、操作の影響を受けたどのように多くの行と言ってクライアントにメッセージを返すことはないSQL Serverのを指示します。トリガーでは、元の照会(トリガーを起動した挿入、更新、または削除)の行数と競合する情報の送信を避けるためによく使用されます。 selectがこのメッセージを返すので、すべてのトリガーの開始時に配置することをお勧めします。

+0

私の時間を節約しました –

関連する問題

 関連する問題