2012-09-21 26 views
5

Tengo un activador que actualiza uno de los campos insertados (RootId) con el valor de la clave principal de identidad (Id. De mensaje) del mismo registro insertado. La actualización sólo debería ocurrir cuando el campo IDraiz del registro insertado es 0. El disparador es el siguiente:La instrucción contiene una cláusula OUTPUT sin error de cláusula 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 en Azure y cuando inserto una fila, me da el siguiente error:

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

El mismo disparador funciona en mi MS SQL real 2012. Supongo que hay una diferencia en la configuración, pero no entiendo qué intenta decirme.

¿Estoy sobrecomplicando algo? Gracias!

+2

Por favor, muestre la declaración que contiene la cláusula 'OUTPUT'. He visto ese error antes en SQL Server 2008 y tuve que recurrir a 'OUTPUT INTO @ tablevar' y luego seleccionar desde la variable de la tabla. –

+0

Utilizo 'OUTPUT INTO @ tablevar' en 2008 R2 para fines defensivos también (en caso de que alguien cree un disparador) debido a este error. Sin embargo, solo salí las teclas principales y luego me uní a @tablevar al seleccionar porque no funcionaba con todos los tipos de datos, IIRC. –

+0

El error es generado por el editor de tablas Azure/Silverlight. Supongo que cuando edito una fila allí, Azure genera una instrucción T-SQL, que incluye la SALIDA sin INTO. Usar el código C#/LINQ para actualizar una fila funciona. –

Respuesta

0

Creo que puede estar relacionado con lo que escribió Anthony Horne.

¿Funciona?

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 
Cuestiones relacionadas