web-dev-qa-db-fra.com

Déclencheur SQL Insert pour mettre à jour les valeurs de table INSERTED

Je veux créer un déclencheur d'insertion qui met à jour les valeurs sur toutes les lignes insérées si elles sont nulles, les nouvelles valeurs doivent être prises dans une table différente, selon une autre colonne de la table insérée.

J'ai essayé:

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

Mais je reçois cette erreur:

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

Comment dois-je faire ça?

27
Shimmy

Vous devez mettre à jour la table de destination, pas la table logique. Vous vous joignez à la table logique, cependant, pour déterminer les lignes à mettre à jour:

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
45
Michael Haren

Vous pouvez remplacer le déclencheur par INSTEAD OF INSERT. Cela vous permettra de vérifier les valeurs entrantes et, si nécessaire, de les remplacer par les valeurs de votre autre table.

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

REMARQUE: les déclencheurs INSTEAD OF ne provoquent PAS de récursivité.

20
Jeff French
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 );

C'est de là que vient ma table de sortie. L'insertion n'est donc pas faite de valeurs.

Je suis vraiment désolé mais je ne peux pas accéder à mon compte d'ici (bureau),

0
Rohan