2009-12-03 16 views
24

Quiero crear un activador Insertar que actualice valores en todas las filas insertadas si son nulas, los nuevos valores deben tomarse de una tabla diferente, de acuerdo con otra columna en el inserto mesa.Activador Insertar SQL para actualizar valores de tabla INSERTED

me trataron:

UPDATE INSERTED 
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol 
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1 
    ) 
WHERE ValueCol IS NULL 

pero me sale este error:

Msg 286, Level 16, State 1, Procedure ThisTable_INSERT, Line 15 
The logical tables INSERTED and DELETED cannot be updated. 

¿Cómo debo hacer eso?

+0

Si no se va a encapsular la lógica de manejar esto en un procedimiento almacenado, una alternativa mejor que un disparador sería para usar una restricción predeterminada: http://msdn.microsoft.com/en-us/library/aa175912%28SQL.80%29.aspx –

+0

DESEO PODRÍA USAR VALORES POR DEFECTO PERO, COMO PUEDE VER, QUIERO ACTUALIZAR MI TABLA SEGÚN DIFERENTES COLUMNAS EN LA FILA INSERTADA, QUE NO ES APLICABLE CON 'DEFAULT'S – Shimmy

+1

@OMG Ponies: Shimmy no puede usar un valor predeterminado según la pregunta: http://stackoverflow.com/questions/1744455 – gbn

Respuesta

39

Debe actualizar la tabla de destino, no la tabla lógica. Se une a la tabla lógica, sin embargo, para averiguar qué filas para actualizar:

UPDATE YourTable 
SET TheColumnToBeUpdated = 
    (
    SELECT TheValueCol FROM AnotherTable.ValueCol 
    WHERE AnotherTable.ValudCol1 = INSERTED.ValueCol1 
    ) 
FROM YourTable Y 
JOIN Inserted I ON Y.Key = I.Key 
WHERE I.ValueCol IS NULL 
19

podría cambiar el gatillo para un LUGAR DE INSERTAR. Esto le permitirá verificar los valores entrantes y, si es necesario, reemplazarlos con los valores de su otra tabla.

CREATE TRIGGER CoolTrigger 
ON MyAwesomeTable 
INSTEAD OF INSERT 
AS 
BEGIN 

INSERT MyAwesomeTable (TheValueCol) 
SELECT ISNULL(INSERTED.TheValueCol, AnotherTable.TheValueCol) AS TheValueCol 
FROM INSERTED 
JOIN AnotherTable ON INSERTED.ValueCol1 = AnotherTable.ValueCol1 

END 

NOTA: los desencadenadores INSTEAD OF NO provocan recursividad.

0
insert into output 
(SELECT t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND, 
t1.ts - INTERVAL (SECOND(t1.ts)%10) SECOND + INTERVAL 10 SECOND ,sum(t1.data), 
FROM (select * from input 
where unix_timestamp(ts) >= unix_timestamp('2000-01-01 00:00:10') 
and unix_timestamp(ts) < unix_timestamp('2000-01-01 00:01:20') 
) 
    as t1 
GROUP BY UNIX_TIMESTAMP(t1.ts) DIV 10); 

Aquí es donde está mi tabla de salida. Entonces la inserción no es por valores.

Im lo siento, pero no puedo acceder a mi cuenta de aquí (oficina),

Cuestiones relacionadas