2012-09-21 8 views
5

Possiedo un trigger che aggiorna uno dei campi inseriti (RootId) con il valore della chiave primaria identità (MessageId) dello stesso record inserito. L'aggiornamento dovrebbe avvenire solo quando il campo RootId del record inserito è 0. L'innesco si presenta così:contiene una clausola OUTPUT senza errore nella clausola INTO

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 

lo uso in Azure e quando inserisco una riga, mi dà il seguente errore:

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

Lo stesso trigger funziona sul mio vero MS SQL 2012. Presumo che ci sia una differenza nelle impostazioni ma non ottengo quello che prova a dirmi.

Sono troppo complicato? Grazie!

+2

Si prega di mostrare la dichiarazione che contiene la clausola 'OUTPUT'. Ho già visto questo errore su SQL Server 2008 e ho dovuto ricorrere a "OUTPUT INTO @ tablevar', quindi selezionare dalla variabile table. –

+0

Io uso 'OUTPUT INTO @ tablevar' nel 2008 R2 anche a scopo difensivo (nel caso in cui qualcuno crea un trigger) a causa di questo errore. Ho solo OUTPUT le chiavi primarie, però, e quindi mi unisco a @tablevar quando lo seleziono perché non ha funzionato con tutti i tipi di dati, IIRC. –

+0

L'errore viene generato dall'editor delle tabelle di Azure/Silverlight. Presumo che quando si modifica una riga, Azure genera un'istruzione T-SQL, che include OUTPUT senza INTO. Utilizzando il codice C#/LINQ per aggiornare una riga funziona. –

risposta

0

Penso che possa essere collegato a ciò che Anthony Horne ha scritto.

Funziona?

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 
Problemi correlati