2012-09-21 6 views
5

Ich habe einen Trigger, der eines der eingefügten Felder (RootId) mit dem Wert des Identitätsprimärschlüssels (MessageId) desselben eingefügten Datensatzes aktualisiert. Das Update sollte nur dann geschehen, wenn das rootID Feld des eingefügten Datensatz ist 0. Der Auslöser wie folgt aussieht:Anweisung enthält eine OUTPUT-Klausel ohne INTO-Klausel Fehler

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 

ich es in Azure verwenden und wenn ich eine Zeile einfügen, es gibt mir die folgende Fehlermeldung:

Derselbe Trigger funktioniert auf meinem echten MS SQL 2012. Ich nehme an, dass es einen Unterschied in den Einstellungen gibt, aber ich bekomme nicht, was es versucht, mir zu sagen.

Bin ich etwas zu kompliziert? Danke!

+2

Bitte zeigen Sie die Anweisung, die die OUTPUT-Klausel enthält. Ich habe diesen Fehler zuvor in SQL Server 2008 gesehen und musste zu OUTPUT INTO @ tablevar wechseln und dann aus der Tabellenvariablen auswählen. –

+0

Ich verwende 'OUTPUT INTO @ tablevar' in 2008 R2 auch für defensive Zwecke (falls jemand einen Trigger erstellt) wegen dieses Fehlers. Ich habe jedoch nur Primärschlüssel OUTPUT, und dann @tablevar bei der Auswahl beizutreten, weil es nicht mit allen Datentypen, IIRC funktioniert. –

+0

Der Fehler wird vom Azure/Silverlight-Tabelleneditor generiert. Ich gehe davon aus, dass Azure beim Bearbeiten einer Zeile eine T-SQL-Anweisung generiert, die OUTPUT ohne INTO enthält. Die Verwendung des C#/LINQ-Codes zum Aktualisieren einer Zeile funktioniert. –

Antwort

0

Ich denke, dass es mit dem verwandt sein kann, was Anthony Horne schrieb.

Funktioniert das?

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 
Verwandte Themen