2009-12-03 4 views
24

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 à partir d'une autre table, selon une autre colonne dans l'insertion table.SQL Insérer déclencheur pour mettre à jour la table INSERTION valeurs

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?

+0

Si vous n'allez pas pour encapsuler la logique de gérer cela dans une procédure stockée, une meilleure alternative qu'un déclencheur serait pour utiliser une contrainte par défaut: http://msdn.microsoft.com/en-us/library/aa175912%28SQL.80%29.aspx –

+0

JE SOUHAITE UTILISER DES DÉFAUTS, MAIS COMME VOUS POUVEZ VOIR JE VEUX METTRE À JOUR MON TABLE SELON LES COLONNES DIFFÉRENTES DANS LA RANG INSÉRÉE, QUI N'EST PAS APPLICABLE AVEC LES Poneys @OMG – Shimmy

+1

PAR DÉFAUT: Shimmy ne peut pas utiliser un défaut selon la question: http://stackoverflow.com/questions/1744455 – gbn

Répondre

39

Vous devez mettre à jour la table de destination et non la table logique. Vous joindre à la table logique, bien que, pour comprendre les lignes de mise à 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 
19

Vous pouvez changer le déclencheur 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é.

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); 

C'est de là que vient ma table de sortie. Donc l'insertion n'est pas par des valeurs.

Im désolé mais je ne peux pas accéder à mon compte à partir d'ici (bureau),

Questions connexes