2012-09-21 42 views
5

挿入されたフィールド(RootId)の1つを同じ挿入レコードのID主キー(MessageId)の値で更新するトリガがあります。ステートメントにINTO句エラーのないOUTPUT句が含まれています

ALTER TRIGGER [dbo].[Trigger_RootIdUpdate] 
    ON [dbo].[Messages] 
    AFTER INSERT 
AS BEGIN 
    SET NOCOUNT ON; 

    DECLARE @MessageId Int 

    SELECT @MessageId = I.MessageId   
     FROM INSERTED I 
    UPDATE Messages 
     SET RootId = @MessageId 
    WHERE MessageId = @MessageId AND MessageId = 0 

END 

私はアズールでそれを使用すると、私は行を挿入するとき、それは私に次のエラーを与える:挿入されたレコードのRootIdフィールドはトリガは次のようになります0 とき更新にのみ起こるはず

The target table 'dbo.Messagess' of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause.

私の実際のMS SQL 2012では、同じトリガーが動作します。設定に違いがあると思われますが、私には何を伝えようとしているのですか?

私は何かをオーバーコンプリートしていますか? ありがとう!

+2

「OUTPUT」句を含む文を表示してください。以前はSQL Server 2008でこのエラーが発生しましたが、テーブル変数から選択して 'OUTPUT INTO @ tablevar'に頼らざるを得ませんでした。 –

+0

このエラーのために2008 R2に 'OUTPUT INTO @ tablevar'を防御目的でも使用します(誰かがトリガーを作成した場合)。ただし、主キーのみを出力し、IIRCのすべてのデータ型では機能しなかったため、選択時に@tablevarに参加します。 –

+0

エラーは、Azure/Silverlightテーブルエディタによって生成されます。ここで行を編集すると、AzureはINTOなしのOUTPUTを含むT-SQLステートメントを生成すると仮定します。行を更新するためにC#/ LINQコードを使用すると動作します。 –

答えて

0

アンソニー・ホーンが書いたものに関連していると思います。

これは機能しますか?

ALTER TRIGGER [dbo].[Trigger_RootIdUpdate] 
    ON [dbo].[Messages] 
    AFTER INSERT 
AS BEGIN 
    UPDATE 
    Messages 
    SET 
    Messages.RootId = INSERTED.MessageId 
    FROM Messages Msg 
    JOIN INSERTED ON 
    Msg.MessageId = INSERTED.MessageId 
    WHERE 
    Msg.MessageId = INSERTED.MessageId 
    AND INSERTED.RootId = 0; 
END 
関連する問題