Триггер SQL Insert для обновления значений таблицы INSERTED - PullRequest
27 голосов
/ 03 декабря 2009

Я хочу создать триггер вставки, который обновляет значения во всех вставленных строках, если они нулевые, новые значения должны быть взяты из другой таблицы, согласно другому столбцу во вставленной таблице.

Я пытался:

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

Но я получаю эту ошибку:

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

Как мне это сделать?

Ответы [ 3 ]

44 голосов
/ 03 декабря 2009

Вам необходимо обновить таблицу назначения, а не логическую таблицу. Тем не менее, вы присоединяетесь к логической таблице, чтобы выяснить, какие строки нужно обновить:

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
20 голосов
/ 03 декабря 2009

Вы можете изменить триггер на INSTEAD OF INSERT. Это позволит вам проверить входящие значения и при необходимости заменить их значениями из другой таблицы.

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

ПРИМЕЧАНИЕ. Триггеры INSTEAD OF НЕ вызывают рекурсию.

0 голосов
/ 25 января 2013
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 );

Отсюда и моя выходная таблица. Таким образом, вставка не по значениям.

Мне очень жаль, но я не могу получить доступ к своей учетной записи отсюда (офис),

...