2012-09-21 34 views
5

我有一個觸發器,它使用相同插入記錄的標識主鍵(MessageId)的值更新一個插入字段(RootId)。聲明包含一個沒有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 

我用它在Azure和當我插入一排,它給了我下面的錯誤:當插入記錄的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'作爲防禦目的(在有人創建觸發器的情況下)。我只輸出主鍵,然後在選擇時加入@tablevar,因爲它不適用於所有數據類型,IIRC。 –

+0

該錯誤由Azure/Silverlight表編輯器生成。我假設當我在那裏編輯一行時,Azure會生成一個T-SQL語句,其中包含沒有INTO的OUTPUT。使用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 
相關問題