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?
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
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é.
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),